这是用户集合(伪):
[
{
_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中进行投影。我应该怎么做?任何建议都会非常感激。
答案 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"
}