Mongodb 如何搜索嵌入式阵列
我想使用$elemMatch获取所有匹配值Mongodb 如何搜索嵌入式阵列,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想使用$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 } } }) ; 我的实验结果是{values:[3,4,5,6,7,8,9]}。但是,真正的结果是{values:[4]}。 我阅读了mongo
// create test data
db.foo.insert({values:[0,1,2,3,4,5,6,7,8,9]})
db.foo.find({},{
'values':{
'$elemMatch':{
'$gt':3
}
}
}) ;
我的实验结果是{values:[3,4,5,6,7,8,9]}。但是,真正的结果是{values:[4]}。
我阅读了mongo文件,我理解这是规范
如何搜索多个值?
此外,我还使用“跳过”和“限制”
有什么想法吗?使用聚合:
db.foo.aggregate([
{$unwind:"$values"},
{$match:{"values":{$gt:3}}},
{$group:{"_id":"$_id","values":{$push:"$values"}}}
])
如果愿意,可以在$match中添加进一步的筛选条件
使用$elemMatch操作符无法实现这一点,因为mongoDB doc说:
$elemMatch投影运算符限制数组的内容
字段,该字段包含在查询结果中,仅包含数组
与$elemMatch条件匹配的元素
注意
The elements of the array are documents.
如果仔细查看操作符查询的文档或对应项,您将看到这种类型的“投影”只返回“第一个”匹配的元素 您所寻找的实际上是文档内容的“操纵”,您希望“过滤”文档中数组的内容,而不是返回原始或“匹配”元素,因为只有一个匹配项 要实现真正的“过滤”,您需要聚合框架,因为它对文档操作有更多的支持:
db.foo.aggregate([
//选择与您的条件不匹配的文档毫无意义
{“$match”:{“values”:{“$gt”:3}}},
//展开数组以反规范化为文档
{“$unwind”:“$values},
//匹配到“筛选”数组
{“$match”:{“values”:{“$gt”:3}}},
//分组到数组窗体
{“$组”:{
“\u id”:“$\u id”,
“值”:{“$push”:“$values”}
}}
])
或者使用2.6及以后版本的MongoDB,其中数组值是“唯一的”,您可以执行以下操作:
db.foo.aggregate([
{“$project”:{
“价值观”:{
“$setDifference”:[
{“$map”:{
“输入”:“$values”,
“as”:“el”,
“在”:{
“$cond”:[
{“$gt”:[“$$el”,3]},
“$$el”,
假的
]
}
}},
[错误]
]
}
}}
])
谢谢。我知道如何使用$$Matalm。我再次考虑集合结构。