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

Mongodb 如何查询嵌入式数组中的两个字段?,mongodb,Mongodb,我有一份类似下面的文件。periods字段定义用户访问某些数据的时间段 { "_id":ObjectId("51878ecc0e9528429ab6e7cf"), "name" : "Peter Flack", "periods":[ { "from":1, "to":2 }, { "from":4, "to":6 }, { "f

我有一份类似下面的文件。
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
,所以必须对数组中每个元素的参数使用$elemMatch:elemMatch match

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

必须为数组的每个元素中的参数使用$elemMatch:elemMatch match

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

对不起,没用。据我所知,$elemMatch是用于项目的。也就是说,它只影响文档中要返回的字段,而不影响文档是否应该返回。在文档中查找时,它仅用于find()函数的第二个参数。@luttkens
$elemMatch
也是一个查询运算符。医生。当您编写查询时,它运行良好,我认为您已将
$gte
$lte
运算符交换,以执行您实际需要的操作。@luttkens:$elemMatch将起作用。我已经修改了我之前的评论check@Abhishek如果您使用它,并表示从1到1,则不会返回任何内容,但它位于文档中。事实上,这个问题令人困惑,因为1)它表示“在周期内”,但2)它表示匹配(我猜完全匹配from和to。如果我理解正确,你说的是:{from:{$gte:1},to:{$lte:1}对于上面的查询,我看不到任何与条件匹配的文档。如果我遗漏了某些内容,请解释。抱歉,不起作用。据我所知,$elemMatch用于项目。也就是说,它只影响文档中要返回的字段,而不影响文档是否应返回。查看文档时,它仅用于find()的第二个参数函数。@luttkens
$elemMatch
也是一个查询运算符。Docs。当您编写查询时,它工作得很好,我想您已经将
$gte
$lte
运算符交换,以执行您实际需要的操作。@luttkens:$elemMatch可以工作。我已经修改了前面的注释,请check@Abhishek如果你用它nd说从1到1没有返回任何东西,但它在一个文档中。事实上,这个问题令人困惑,因为1)它说“在期间内”,但2)它说匹配(我猜完全匹配from和to。如果我理解正确,你说的是:{from:{$gte:1},to:{$lte:1}对于上面的查询,我看不到任何符合条件的文档。如果我遗漏了什么,请解释