是否可以将子文档与MongoDB上的特定字段的文档连接起来?

时间:2016-06-04 12:31:52

标签: javascript mongodb aggregation-framework

这是用户集合(伪):

[
    {
        _id: ...,
        email: 'user1@exam.com'
        image: 'user1.png',
        nickname: 'appleGuy',
        createdAt: ...,
        updatedAt: ...
    },
    {
        id: ...,
        email: 'user2@exam.com',
        image: 'user2.png',
        nickname: 'bananaGuy',
        createdAt: ...,
        updatedAt: ...
    }
]

您可以看到字段:电子邮件,图片,昵称。这是实现地址簿的其他集合:

[
    {
        _id: ...,
        email: 'user1@exam.com',
        list: [
            {
                email: 'user2@exam.com',
                createdAt: ...,
                updatedAt: ...
            },
            {
                email: 'user3@exam.com',
                createdAt: ...,
                updatedAt: ...
            }
            { ... },
            { ... }
        ]
    }
]

地址簿的每个文件都有电子邮件字段来区分其地址簿,并列出包含每个项目的字段。 如您所见,addressbook.list是数组,因此它可以作为子文档调用。 但是子文档不包含昵称和图像字段,所以我想加入它们。 我想我可以通过聚合管道做到这一点。我可以使用普通文档执行此操作,但我不知道如何使用子文档上的文档。还有用户集合和addressbook.list的文档,都有createdAt和updatedAt字段(同名,不同的数据),我想在addressbook.list中进行投影。我应该怎么做?任何建议都会非常感激。

1 个答案:

答案 0 :(得分:0)

解决!

db.addressbook.aggregate([
    {
        $match: { email }
    },
    {
        $unwind: '$list'
    },
    {
        $project: {
            email: '$list.email'
        }
    },
    {
        $lookup: {
            from: 'user',           
            localField: 'email',    
            foreignField: 'email',  
            as: 'embedded'
        }
    },
    {
        $unwind: '$embedded'
    },
    {
        $project: {
            email: '$email',
            nickname: '$embedded.nickname',
            image: '$embedded.image'
        }
    }
]);

结果:

{
    "_id" : ObjectId("..."),
    "email" : "user2@exam.com",
    "nickname" : "user2",
    "image" : "default"
}
{
    "_id" : ObjectId("..."),
    "email" : "user3@exam.com",
    "nickname" : "user3",
    "image" : "default"
}    
相关问题