在猫鼬中繁殖然后聚集



我真的想填充然后聚合

    Comps.find().populate({
        path : "reviews",
        model : "Review"
    }).exec(function(err, populatedData){
        if(err) console.log(err)
        console.log("populatedData--", populatedData)
    }).aggregate([
        {$unwind : "$reviews"}
    ]).exec(function(err, doc){
        if(err) throw err;
        console.log("statements from aggregate", doc)
    })

每当用户进行评论时,我将评论的对象id添加到Comps集合的reviews数组中。现在我在Comps内部填充评论。我想对评论做汇总。

我在这个问题中看到我不能这样做,因为客户端和服务器端的东西,但我不知道如何修复它。

在链接中,答案基本上是制作自己的填充方法来将集合放在一起?当他使用$lookup时?

这是> db.comps.find().pretty()的文档之一

{
        "_id" : ObjectId("579706567f9c8cbc07482e65"),
        "name" : "comp1",
        "industry" : "industry1",
        "anonUsers" : [ ],
        "users" : [ ],
        "reviews" : [
                "57ad8c4353ef022423dcdadb",
                "57ad98e5cdc0ec7009530519",
                "57ad997e51c65ab8283d9c19",
                "57ad99f3480d0ffc141ffdf3",
                "57ad9aafcba3fb3029b22b19",
                "57ad9b953643bbb428034966",
                "57ad9d022ac828040b51f824",
                "57ad9d362bd44db8226efd47",
                "57ad9e6f000e02082adf1110",
                "57ad9fa3e4c8a91c20e8b805",
                "57ada040717ddc10250b2255",
                "57ada069e3f0f96422253364",
                "57adf85d6312904c0ee62ae5",
                "57adfce8b9be606007c073b1",
                "57adff001600b53c0fe74d35"
        ],
        "__v" : 16
}

这里是db.reviews.find().pretty()

{
        "_id" : ObjectId("57adff001600b53c0fe74d35"),
        "updatedAt" : ISODate("2016-08-12T16:53:30.510Z"),
        "createdAt" : ISODate("2016-08-12T16:53:20.318Z"),
        "vote" : "up",
        "reviewText" : "coolio again",
        "company" : ObjectId("579706567f9c8cbc07482e65"),
        "companyName" : "comp1",
        "userType" : "anon",
        "user" : ObjectId("57adfef51600b53c0fe74d34"),
        "statements" : [
                {
                        "name" : "statement3",
                        "question" : "This is the question for statement3",
                        "result" : 8
                },
                {
                        "name" : "statement4",
                        "question" : "This is the question for statement4",
                        "result" : 7
                },
                {
                        "name" : "statement6",
                        "question" : "This is the question for statement6",
                        "result" : 6
                }
        ],
        "__v" : 1,
        "className" : "thisUser",
        "momented" : "a few seconds ago"
}

编辑我试着从链接做这个。它只给我比较和评论是一个id列表。reviews应该是一个对象数组。对象应该是来自reviews集合的评论。像人口

Comps.aggregate([
    {"$lookup": {
        "from" : "Reviews",
        "localField" : "_id",
        "foreignField": "_id", 
        "as": "returndComp"
    }}
], function(err, result){
    if(err) throw err;
    console.log("result", result)
})

正如链接的答案所述,您不能先执行populate()然后执行aggregate(),但您肯定可以使用 $lookup 来实现所需的内容。因为reviews是一个数组,所以需要在管道中添加一个 $unwind 阶段。

最后额外的 $unwind 阶段是用来平整化来自 $lookup 管道的数组字段。

下面的例子显示了这一点:

Comps.aggregate([
    { "$unwind": "$reviews" },
    {
        "$lookup": {
            "from": "Reviews",
            "localField": "reviews",
            "foreignField": "_id",
            "as": "review"
        }
    },
    { "$unwind": "$review" },
]).exec(function(err, doc){
    if(err) throw err;
    console.log("statements from aggregate", doc)
});

相关内容

  • 没有找到相关文章

最新更新