如何查询嵌入数组中的两个字段?

时间:2013-05-06 11:34:13

标签: mongodb

我有一个类似下面的文件。 periods字段定义用户有权访问某些数据的时间段。

{
   "_id":ObjectId("51878ecc0e9528429ab6e7cf"),
   "name" : "Peter Flack",
   "periods":[
      {
         "from":1,
         "to":2
      },
      {
         "from":4,
         "to":6
      },
      {
         "from":10,
         "to":12
      }
   ]
}

现在我想确定任意时段是否在period字段的任何时段内。我尝试过以下方法:

db.subs.find({"periods.from" : {$gte : 1}, "periods.to" : {$lte : 12}, "periods.from" : {$lte : 12}, "periods.to" : {$gte : 1}})

此查询返回文档,因为数组中有一个元素from> = 1,antoher元素to< = 12。

但是,只有当同一元素中的fromto 符合条件时,我才想取回文档。

如何编写查询来实现此目的?

1 个答案:

答案 0 :(得分:4)

你必须在数组的每个元素中使用$ elemMatch:elemMatch匹配参数。

Mongo > db.subs.find({periods : {$elemMatch : { from : {$gte : 1, $lte:12}, to : {$gte : 1, $lte : 12} }}}).pretty()
{
    "_id" : ObjectId("51878ecc0e9528429ab6e7cf"),
    "name" : "Peter Flack",
    "periods" : [
        {
            "from" : 1,
            "to" : 2
        },
        {
            "from" : 4,
            "to" : 6
        },
        {
            "from" : 10,
            "to" : 12
        }
    ]
}
Mongo > db.subs.find({periods : {$elemMatch : { from : {$gte : 2, $lte : 4}, to : {$gte : 10, $lte : 12} }}}).pretty()
no result