首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB获取SubDocument

MongoDB获取SubDocument
EN

Stack Overflow用户
提问于 2014-01-14 20:25:17
回答 2查看 18.6K关注 0票数 19

我想从MongoDB中的文档中检索子文档。我有以下文档:

代码语言:javascript
复制
{
    "_id" : "10000",
    "password" : "password1",
    "name" : "customer1",
    "enabled" : true,
    "channels" : [ 
        {
            "id" : "10000-1",
            "name" : "cust1chan1",
            "enabled" : true
        }, 
        {
            "id" : "10000-2",
            "name" : "cust1chan2",
            "enabled" : true
        }
    ]
}

我想要的结果是:

代码语言:javascript
复制
{
    "id" : "10000-1",
    "name" : "cust1chan1",
    "enabled" : true
}

但是,到目前为止,我能做的最好的事情是使用以下查询:

代码语言:javascript
复制
db.customer.find({"channels.id" : "10000-1"}, {"channels.$" : 1, "_id" : 0})

但这给了我以下结果:

代码语言:javascript
复制
{
    "channels" : [ 
        {
            "id" : "10000-1",
            "name" : "cust1chan1",
            "enabled" : true
        }
    ]
}

有没有人知道有没有可能写一个能给我想要的结果的查询?任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2014-01-14 20:32:58

您可以使用聚合框架来完成此任务。查询将如下所示:

代码语言:javascript
复制
db.customer.aggregate([
    {$unwind : "$channels"},
    {$match : {"channels.id" : "10000-1"}},
    {$project : {_id : 0, 
                 id : "$channels.id", 
                 name : "$channels.name", 
                 enabled : "$channels.enabled"}}
])
票数 13
EN

Stack Overflow用户

发布于 2018-09-10 23:08:18

使用MongoDB 3.4.4和更高版本,聚合框架提供了许多运算符,您可以使用这些运算符返回所需的子文档。

考虑运行一个聚合管道,该管道使用单个阶段将筛选出的子文档提升到顶层,并替换所有其他字段。

过滤子文档需要运算符,该运算符根据指定的条件选择要返回的数组的子集,即返回一个只包含符合条件的元素的数组。然后,可以使用运算符将单个数组元素转换为文档

总的来说,运行此聚合操作将产生所需的结果:

代码语言:javascript
复制
db.customer.aggregate([
    { "$replaceRoot": { 
        "newRoot": {
            "$arrayElemAt": [
                { "$filter": {
                   "input": "$channels",
                   "as": "channel",
                   "cond": { /* resolve to a boolean value and determine if an element should be included in the output array. */
                       "$eq": ["$$channel.id", "10000-1"]
                    } 
                } },
                0 /* the element at the specified array index */
            ]
        }
    } }
])

输出

代码语言:javascript
复制
{
    "id" : "10000-1",
    "name" : "cust1chan1",
    "enabled" : true
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21113543

复制
相关文章

相似问题

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