2011-07-26 48 views
0

任何想法,为什么这个查询

{ 
    "_id": ObjectId("4e2a4ca7f21a81331f0006c3"), 
    "categories": { 
    "$nin": [ 
     "Arts" 
    ] 
    } 
} 

返回时,我们明确排除“艺术”与上述万年$以下记录?

{ 
    "_id": ObjectId("4e2a4ca7f21a81331f0006c3"), 
    "categories": { 
    "0": "Arts", 
    "1": "Arts - Performance" 
    } 
} 

的完整性检查,我在

{ 
    "_id": ObjectId("4e2a4ca7f21a81331f0006c3"), 
    "categories": { 
    "$in": [ 
     "Arts" 
    ] 
    } 
} 

改变$万年至$和预期它不返回任何东西..但我仍然高于$ nin的结果不解!

回答

0

您的第一个查询是请求具有特定ID的文档,其中categories的值不在字符串列表中(在此例中为["Arts"])。此文档的categories的值是一个嵌入文档,{ "0": "Arts", "1": "Arts - Performance" }

第二个查询不返回任何内容,因为该嵌入式文档不在categories字段提供的值列表中。

编辑:如果您希望能够搜索使用$in$nin,你应该考虑categories子文档转换成一个数组类:

> db.foo.save({categories: ["Arts", "Arts - Performance"]})              
> db.foo.save({categories: ["Sports", "Sports - Baseball"]}) 
> db.foo.find({categories: {$nin: ["Arts"]}})     
{ "_id" : ObjectId("4e2e3b49aed2871354b374eb"), "categories" : [ "Sports", "Sports - Baseball" ] } 
> db.foo.find({categories: {$in: ["Arts"]}})     
{ "_id" : ObjectId("4e2e3b1eaed2871354b374ea"), "categories" : [ "Arts", "Arts - Performance" ] } 
+0

所以,_id不谈,有什么的正确方法使用现有的文档结构只搜索非“艺术”类别? – bobby

+0

上面编辑了我的答案。 – dcrosta

+0

非常感谢。哦,哇...我最初保存它作为一个关联数组...我现在认为无法正确使用$ in/$ nin搜索?因此,您要求我将它转换为1d数组的原因是什么? – bobby