Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何搜索嵌入式阵列_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 如何搜索嵌入式阵列

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

我想使用$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文件,我理解这是规范

如何搜索多个值? 此外,我还使用“跳过”和“限制”

有什么想法吗?

使用聚合:

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。我再次考虑集合结构。