2014-05-16 150 views
1

我有以下模式的集合:添加索引改變查詢結果

db.posts.insert({sents: 
    [ 
     {uni:['a','b','c'],bi:[['a','b'],['b','c']]}, 
     {uni:['x','y','z'],bi:[['x','y'],['y','z']]} 
    ]}) 

下面的查詢返回上方插入記錄:

> db.posts.find({'sents.bi':{'$elemMatch':{'$in':['a']}}}) 
{ 
    "_id" : ObjectId("537595f254bae6dfabddf0c9"), 
    "sents" : [  
     { 
      "uni": [ "a", "b", "c" ], 
      "bi": [[ "a", "b" ], [ "b", "c" ] ] 
     }, 
     { 
      "uni": [ "x", "y", "z" ], 
      "bi": [ [ "x", "y" ], [ "y", "z" ] ] 
     } 
    ] 
} 

然而,當我在創建索引'sents.bi':

>db.posts.ensureIndex({'sents.bi':1}) 

上述查詢停止工作G:

> db.posts.find({'sents.bi':{'$elemMatch':{'$in':['a']}}}).count() 
0 

我知道我做錯了什麼,我只是不知道它是什麼,我做錯了:)

謝謝

+0

您使用的是哪個版本的MongoDB? –

+0

無論有沒有索引,上面的查詢都不會給我任何東西。 – yaoxing

+0

@yaoxing那是因爲你使用的是2.6或更高版本。完整的原因在你的回答中評論。 –

回答

1

當你查詢上面列出的不給我任何有或沒有索引的東西。我在想你可能是什麼意思:

db.posts.find({'sents.bi':{'$elemMatch': {$elemMatch: {$in: ['a']}}}}) 

請注意你有一個數組中的數組。你必須做兩次$ elemMatch。

+0

這是對的。有趣的是,原始陳述的查詢在2.6之前的版本中起作用。直到創建索引爲止。另一點是索引是失敗的原因,因爲MongoDB不能使用嵌入數組作爲索引元素。但是這裏顯示的查詢表單將不會選擇該索引,因此它可以工作。但是你無法將這樣的領域編入索引來獲得性能提升。 –

+0

是的,我正在使用2.6。我也試過$提示強制使用索引。雖然它變成了「BtreeCursor」,但它仍然掃描該集合中的其他對象,甚至沒有「sents」屬性。似乎指數仍然沒有生效。 – yaoxing

+0

上面引用的JIRA問題中涵蓋的所有內容。 –