代码之家  ›  专栏  ›  技术社区  ›  HIRA THAKUR

在mongoDb中将对象放置到根级别

  •  1
  • HIRA THAKUR  · 技术社区  · 7 年前

    我有一个从3个集合获取结果的聚合查询。

    我正在使用mongodb3.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 在根级别。 我也无法筛选课程。\u id使用$match on \u id==13

    这是我的聚合查询:

    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以对象结束。我想把它压平,放在根部。

    有人能帮我吗?

    1 回复  |  直到 7 年前
        1
  •  4
  •   dnickless    7 年前

    如果你想要得到的只是你的 partnerMetaInfo $replaceRoot

    {
        $replaceRoot: { "newRoot": { $ifNull: [ "$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
        }
    }
    
    推荐文章