我希望使用$elemMatch获取所有匹配的值。
// create test data
db.foo.insert({values:[0,1,2,3,4,5,6,7,8,9]})
db.foo.find({},{
'values':{
'$elemMatch':{
'$gt':3
}
}
}) ;我的预期结果是{值:3,4,5,6,7,8,9}。但是,真正的结果是{value:4}。我看了蒙戈文件,我明白这是说明书。
如何搜索多个值?此外,我使用‘跳过’和‘限制’。
知道吗?
发布于 2014-09-01 08:23:28
使用聚合:
db.foo.aggregate([
{$unwind:"$values"},
{$match:{"values":{$gt:3}}},
{$group:{"_id":"$_id","values":{$push:"$values"}}}
])如果愿意,可以在$match中添加进一步的筛选条件。
您不能使用$elemMatch操作符来实现这一点,因为,mongoDB文档说:
$elemMatch投影运算符将查询结果中包含的数组字段的内容限制为只包含与$elemMatch条件匹配的数组元素。 Note 数组的元素是文档。
发布于 2014-09-01 08:26:35
如果仔细查看有关$elemMatch的文档或查询$运算符的对应文档,则会发现这种类型的“投影”只返回“第一个”匹配元素。
您要寻找的实际上是对文档内容的“操作”,您希望在其中“过滤”文档中数组的内容,而不是返回原始或“匹配”元素,因为只有一个匹配项。
对于真正的“过滤”,您需要聚合框架,因为对文档操作有更多的支持:
db.foo.aggregate([
// No point selecting documents that do not match your condition
{ "$match": { "values": { "$gt": 3 } } },
// Unwind the array to de-normalize as documents
{ "$unwind": "$values },
// Match to "filter" the array
{ "$match": { "values": { "$gt": 3 } } },
// Group by to the array form
{ "$group": {
"_id": "$_id",
"values": { "$push": "$values" }
}}
])或者使用2.6及以后的MongoDB现代版本,其中数组值是“唯一的”,您可以这样做:
db.foo.aggregate([
{ "$project": {
"values": {
"$setDifference": [
{ "$map": {
"input": "$values",
"as": "el",
"in": {
"$cond": [
{ "$gt": [ "$$el", 3 ] },
"$$el",
false
]
}
}},
[false]
]
}
}}
])https://stackoverflow.com/questions/25601222
复制相似问题