MongoDB的$ nin问题

时间:2011-07-26 03:32:46

标签: mongodb

知道为什么这个查询

{
  "_id": ObjectId("4e2a4ca7f21a81331f0006c3"),
  "categories": {
    "$nin": [
      "Arts"
    ]
  }
}
当我们用$ nin明确排除“Arts”时,

会返回以下记录吗?

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

作为一个完整性检查,我将$ nin改为$ in in

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

并没有按预期返回任何内容..但我仍然对上面的$ nin结果感到困惑!

1 个答案:

答案 0 :(得分: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" ] }