首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何搜索嵌入式数组

如何搜索嵌入式数组
EN

Stack Overflow用户
提问于 2014-09-01 07:57:01
回答 2查看 114关注 0票数 0

我希望使用$elemMatch获取所有匹配的值。

代码语言:javascript
运行
复制
// 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}。我看了蒙戈文件,我明白这是说明书。

如何搜索多个值?此外,我使用‘跳过’和‘限制’。

知道吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-01 08:23:28

使用聚合:

代码语言:javascript
运行
复制
db.foo.aggregate([
{$unwind:"$values"},
{$match:{"values":{$gt:3}}},
{$group:{"_id":"$_id","values":{$push:"$values"}}}
])

如果愿意,可以在$match中添加进一步的筛选条件。

您不能使用$elemMatch操作符来实现这一点,因为,mongoDB文档说:

$elemMatch投影运算符将查询结果中包含的数组字段的内容限制为只包含与$elemMatch条件匹配的数组元素。 Note 数组的元素是文档。

票数 1
EN

Stack Overflow用户

发布于 2014-09-01 08:26:35

如果仔细查看有关$elemMatch的文档或查询$运算符的对应文档,则会发现这种类型的“投影”只返回“第一个”匹配元素。

您要寻找的实际上是对文档内容的“操作”,您希望在其中“过滤”文档中数组的内容,而不是返回原始或“匹配”元素,因为只有一个匹配项。

对于真正的“过滤”,您需要聚合框架,因为对文档操作有更多的支持:

代码语言:javascript
运行
复制
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现代版本,其中数组值是“唯一的”,您可以这样做:

代码语言:javascript
运行
复制
db.foo.aggregate([
    { "$project": {
        "values": {
            "$setDifference": [
                { "$map": {
                    "input": "$values",
                    "as": "el",
                    "in": {
                        "$cond": [
                            { "$gt": [ "$$el", 3 ] },
                            "$$el",
                            false
                        ]
                    }
                }},
                [false]
            ]
        }
    }}
])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25601222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档