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}对于上面的查询,我看不到任何符合条件的文档。如果我遗漏了什么,请解释