1

我有一份类似下面的文件。该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,另一个元素to<= 12。

from但是,只有to 在同一元素中的两者都符合条件时,我才想取回文档。

我将如何编写查询来实现这一点?

4

1 回答 1

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
于 2013-05-06T11:49:24.287 回答