首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将MongoDB $project嵌入文档添加到根级别

将MongoDB $project嵌入文档添加到根级别
EN

Stack Overflow用户
提问于 2016-02-04 01:11:18
回答 5查看 7.6K关注 0票数 15

使用聚合管道,我尝试将嵌入的文档投影到根级别的,而不是单独投影每个字段。

例如,我希望将name从这个集合投影到根级别:

代码语言:javascript
复制
[
    {
        _id: "1",
        name: {
            firstName: "John",
            lastname: "Peters"
        }
    },
    {
        _id: "2",
        name: {
            firstName: "Mary",
            lastname: "Jones"
        }
    }
]

这就是我要找的:

代码语言:javascript
复制
[
    {
        firstName: "John",
        lastname: "Peters"
    },
    {
        firstName: "Mary",
        lastname: "Jones"
    }
]

有没有办法在不单独投影每个字段的情况下做到这一点?我不想这样做:

代码语言:javascript
复制
db.collection.aggregate(
    [
        {
            $project : {
                "_id" : 0,
                "firstName" : "$name.firstName",
                "lastName" : "$name.lastName"
            }
        }
    ]
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-04-06 05:26:31

MongoDB 3.4在聚合管道中有了一个新阶段-- $replaceRoot,它做的正是我们所要求的。

https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/

票数 11
EN

Stack Overflow用户

发布于 2016-02-04 13:47:31

以下是使用JavaScript变量的解决方案。

代码语言:javascript
复制
# Set Object for what to project
var projectWhat = {'_id' : 0};

# Fill Object with keys
Object.keys(db.coll.findOne().name).forEach(function(x){
    projectWhat[x] = "$name." + x;
});

# Do Aggregate
db.coll.aggregate([{$project : projectWhat}])

输出结果将是

代码语言:javascript
复制
{ "firstName" : "John", "lastname" : "Peters" }
{ "firstName" : "Mary", "lastname" : "Jones" }

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2016-02-04 02:25:11

这可以通过使用$setname子文档中的值更新所有文档来实现:

代码语言:javascript
复制
db.collection.find({ "name": {"$exists": 1 } }).forEach(function(doc) {
    var setName = {};
    for ( var k in doc.name ) {
        setName[k] = doc.name[k];
    }
    db.collection.update(
        { "_id": doc._id },
        { "$set": setName, "$unset": "name" }
    );
})

虽然我建议您使用$project,因为它比这个解决方案性能更好,但我可以理解您不想使用$project的原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35183432

复制
相关文章

相似问题

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