我有一个类似于
的架构{
'user_id' : 1,
'marks' : [10, 40]
}
我想找到至少一次在20到30之间得分的用户数。
我尝试了以下查询
db.users.count({
'marks' : {$gte: '20', $lt: '30'}
})
但这也包括那些标记超过30的人......
答案 0 :(得分:24)
使用$elemMatch
将范围查询的两个部分约束到相同的 marks
元素:
db.users.count({
marks: {$elemMatch: {$gte: 20, $lt: 30}}
})
答案 1 :(得分:3)
不仅仅是这个:
db.scores.count( { 'marks' : { '$gt' : min_value , '$lt' : max_value } } )
在您的情况下会转换为:
db.scores.count( { 'marks' : { '$gt' : 20 , '$lt' : 30 } } )
答案 2 :(得分:1)
假设您在收集分数中有以下数据:
{ 'user_id' : 1, 'marks' : [ 10, 40 ] }
{ 'user_id' : 2, 'marks' : [ 5, 18 ] }
{ 'user_id' : 3, 'marks' : [ 15, 25 ] }
{ 'user_id' : 4, 'marks' : [ 22, 33 ] }
然后你希望过滤user_ids 3和4,计数为2。
运行查询的最简单方法是:
db.scores.count({'marks':{$in: [20,21,22,23,24,25,26,27,28,29,30]}})
但不漂亮......
答案 3 :(得分:1)
db.scores.count(
{ marks: { $elemMatch: { $gte: 20, $lt: 30} } }
)
有关更多信息,请参见https://docs.mongodb.com/manual/reference/operator/query/elemMatch/
答案 4 :(得分:0)
用$也可以写
db.scores.count({$and: [{"price": {$lt: 30}}, {"price": {$gte: 20}}]})