MongoDB 嵌套聚合(连接)

MongoDB nested aggregation (join)

我有一个文档想要运行嵌套聚合,但我不知道如何运行这个操作。

内容文档(删除了不必要的字段):

{
    "_id" : ObjectId("5a6b8b734f1408137f79e2cc"),
    "reviews" : [ 
        {
            "_id" : ObjectId("5a6cf7c41562160494238781"),
            "headline" : "",
            "body" : "",
            "likeUsers" : [ 
                {
                    "_id" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2")
                }
            ],
            "dislikeUsers" : [],
            "isCritic" : false,
            "isSpoilers" : false,
            "isTop" : true,
            "rate" : 3,
            "userId" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2"),
            "date" : Timestamp(1517090823, 1)
        }
    ]
}

用户内容:

{
    "_id" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2"),
    "username" : "",
    "password" : "",
    "firstname" : "",
    "lastname" : "",
    "email" : "",
    "mobile" : "",
    "tel" : "",
    "nationalCode" : "",
    "gender" : "male",
    "birthdate" : Timestamp(0, 1),
    "promotionCode" : "12131SKSQ",
    "status" : 1,
    "created" : Timestamp(1516986633, 1),
    "updated" : Timestamp(1516986633, 2)
}

我想从 likeUsers 数组字段中获取所有用户信息。

您可以使用 $lookup 聚合来获取喜欢的用户的信息作为嵌入式数组

db.content.aggregate(
    [
        {$match : {"_id" : ObjectId("5a6b8b734f1408137f79e2cc")}},
        {
            $lookup : {
                from : "user",
                localField : "reviews.likeUsers._id",
                foreignField : "_id",
                as : "likeUsersInfo"
            }
        }
    ]
)

EDIT-1

在同一层次结构中嵌入文档

db.content.aggregate(
    [
        {$match : {"_id" : ObjectId("5a6b8b734f1408137f79e2cc")}},
        {
            $lookup : {
                from : "user",
                localField : "reviews.likeUsers._id",
                foreignField : "_id",
                as : "likeUsersInfo"
            }
        },
        {$addFields : {"reviews.likeUsers" : "$likeUsersInfo"}},
        {$project : {likeUsersInfo : 0}}
    ]
).pretty()

非常感谢您的回复。有可能在 reviews.likerUsers 中准确获取用户信息吗?我需要 return 这样的结果:

{
    "_id" : ObjectId("5a6b8b734f1408137f79e2cc"),
    "reviews" : [ 
        {
            "_id" : ObjectId("5a6cf7c41562160494238781"),
            "headline" : "",
            "body" : "",
            "likeUsers" : [ 
                {
                  "_id" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2"),
                  "username" : "",
                  "firstname" : "",
                  "lastname" : ""
                }
            ],
            "dislikeUsers" : [],
            "isCritic" : false,
            "isSpoilers" : false,
            "isTop" : true,
            "rate" : 3,
            "userId" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2"),
            "date" : Timestamp(1517090823, 1)
        }
    ]
}

我终于可以使用 $addFields$project 命令获取准确标记中的用户信息。我为有限的用户信息字段添加了另一个 $project。操作 运行 成功并且 reviews.likeUsers。[users] 字段有限但内容字段未显示。

新查询:

db.contents.aggregate(
    // Pipeline
    [
        // Stage 1
        {
            $lookup: // Equality Match
            {
                            from : "users",
                            localField : "reviews.likeUsers._id",
                            foreignField : "_id",
                            as : "likeUsersInfo"
            }
        },

        // Stage 2
        {
            $addFields: {"reviews.likeUsers" : "$likeUsersInfo"}
        },

        // Stage 3
        {
            $project: {likeUsersInfo : 0}
        },

        // Stage 4
        {
            $project: {"reviews.likeUsers.username": 1,"reviews.likeUsers.firstname": 1,"reviews.likeUsers.lastname": 1}
        },

    ]
);

在 运行 上面的查询之后 return 下面的字段和其他内容字段没有显示:

{
    "_id" : ObjectId("5a6b8b734f1408137f79e2cc"),
    "reviews" : [ 
        {
            "likeUsers" : [ 
                {
                    "username" : "e.farahani",
                    "firstname" : "Ehsan",
                    "lastname" : "Farahani Asil"
                }
            ]
        }
    ]
}