我有一个类似下面的文件。 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。
但是,只有当同一元素中的from
和to
符合条件时,我才想取回文档。
如何编写查询来实现此目的?
答案 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