gpt4 book ai didi

node.js - 将对象放置到 mongoDb 中的根级别

转载 作者:太空宇宙 更新时间:2023-11-03 23:17:57 25 4
gpt4 key购买 nike

我有一个聚合查询,可以从 3 个集合中获取结果。

我使用的是 mongoDb 3.4

来自结果的一个示例文档。

{ 
"_id" : ObjectId("5ba1717ee4b00ce08ca47cfa"),
"name" : "captain jack",
"email" : "jack@gmail.com",
"mobile" : "9000000023",
"status" : "verified",
"courses" : [
{
"_id" : "13",
"name" : "Course (03)"
},{
"_id" : "12",
"name" : "Course (03)"
}
],
"examCompleted" : false,
"login" : "5ba1717ee4b00fe08ca47cfa",
"partnerMetaInfo" : {
"_id" : ObjectId("5ba1717ee4b00fe08ca47cfa"),
"costCode" : "5761",
"hub" : "CALCUTTA",
"location" : "Kolkata"

}
}

我正在尝试将 partnerMetaInfo 引入根级别。我也无法使用 $match on _id == 13 来过滤 course._id

这是我的聚合查询:

db.getCollection("mainCollection").aggregate([
{
//Join two collection
$lookup:{
from: "Details",
localField: "username",
foreignField: "login",
as: "partnerData"
}
},{
//Limit fields
$project:{
"email":1,
"name":1,
"mobile":1,
"status" : 1,
"courses":"$partnerData.courses",
"examScore" : "$partnerData.examScore",
"examCompleted" : "$partnerData.examCompleted",
"login":"$partnerData.login"
}
},
{
//Join third collection
$lookup:{
from: "PartnerMetaInfo",
localField: "login",
foreignField: "partnerId",
as: "partnerMetaInfo"
}
},
//Remove from partnerData array and place at root level.
{
$unwind:
{
path: '$courses',
preserveNullAndEmptyArrays: true
}
},{
$unwind:
{
path: '$examScore',
preserveNullAndEmptyArrays: true
}
},{
$unwind:
{
path: '$examCompleted',
preserveNullAndEmptyArrays: true
}
},{
$unwind:
{
path: '$login',
preserveNullAndEmptyArrays: true
}
},//Bring $partnerMetaInfo array to root level.
{
$unwind:
{
path: '$partnerMetaInfo',
preserveNullAndEmptyArrays: true
}
},{
$limit:10
}
];

$unwind 之后的partnerMetaInfo 最终作为对象。我想把它压平并将其放在根部水平。

有人可以帮我解决这个问题吗?

最佳答案

如果您想要获得的结果只是 partnerMetaInfo 字段的内容,那么您只需添加 $replaceRoot管道末端的阶段如下所示:

{
$replaceRoot: { "newRoot": { $ifNull: [ "$partnerMetaInfo", {} ] } }
}

否则,如果您只想将 partnerMetaInfo 字段内的字段移动到根目录,那么您可以使用 $addFields :

{
$addFields: {
"partnerMetaInfoId" : "$partnerMetaInfo._id",
"costCode" : "$partnerMetaInfo.costCode",
"hub" : "$partnerMetaInfo.hub",
"location" : "$partnerMetaInfo.location"
}
}

如果您有动态数量的字段或不想对字段名称进行硬编码,则可以使用以下逻辑:

{
$replaceRoot: { // merge fields of and move them all the way up
"newRoot": { $mergeObjects: [ "$$ROOT", "$partnerMetaInfo" ] }
}
}, {
$project: { // remove the "partnerMetaInfo" field
"partnerMetaInfo": 0
}
}

关于node.js - 将对象放置到 mongoDb 中的根级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53040711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com