嵌套的對象不是真正的子文檔,我不把它們稱爲子文檔,因爲它們並不像一個文件,並在其上不能使用$
運營商。另外,索引功能對它們並不起作用,但是我們可以將'another_key.key'編入索引以獲得更好的搜索性能。
我建議轉another_key
成看起來像物體(子文檔)的數組:
db.items.insert({
some_key : 'some_value',
another_key : [
{key: 'akey', value: 'avalue'},
{key: 'bkey', value: 'bvalue'}
]
});
您可以通過$大小,關鍵如果你想現在發現。
mongos> db.items.find({another_key: {$size: 0}})
// 0 documents
mongos> db.items.find({another_key: {$size: 1}})
// 0 documents
mongos> db.items.find({another_key: {$size: 2}})
{ "_id" : ObjectId("54f62a48e2fdcc95d4934424"), "some_key" : "some_value", "another_key" : [ { "key" : "akey", "value" : "avalue" }, { "key" : "bkey", "value" : "bvalue" } ] }
mongos> db.items.find({another_key: {$size: 3}})
// 0 documents
mongos> db.collection.find({'another_key.key': 'akey'})
{ "_id" : ObjectId("54f62a48e2fdcc95d4934424"), "some_key" : "some_value", "another_key" : [ { "key" : "akey", "value" : "avalue" }, { "key" : "bkey", "value" : "bvalue" } ] }
不幸的是你不能做比較性$size
查詢:
mongos> db.items.find({another_key: {$size: {$gt:1} } })
error: {
"$err" : "Can't canonicalize query: BadValue $size needs a number",
"code" : 17287
}
嵌套的對象不是真正的子文檔,因此不應該被稱爲子文檔,因爲它們不像個文件,並且不能使用$運算符。我會建議將another_key轉換爲如下所示的對象數組(子文檔):{key:'akey,value:'avalue'}。你現在可以找到$尺寸,如果你想要的話可以找到鑰匙。 db.collection.find({'another_key.key':'aKey})等等。 – 2015-03-03 00:02:00
你能解釋一下這個用例嗎?誠實地說,想做這樣的事很奇怪,我想知道總體目標是什麼。也許有更好的方法?使用'$ where'通常是一個非常糟糕的主意。 – wdberkeley 2015-03-03 19:32:42
@wdberkeley我的特殊使用案例是我正在使用其他人提供的數據,並且我想編寫一個腳本來驗證數據在代碼更新時不會混亂。在我的情況下,我可以檢查它是空的,但我想知道更普遍的問題。 – 2015-03-03 20:27:20