Mongodb:不期望聚合的结果($ lookup)

时间:2018-05-16 04:13:24

标签: mongodb aggregate lookup ref

我正在寻求帮助。

我有一个名为'business'的集合,我有这样的对象:

[{
    "_id": ObjectId("5aefa97166763d28fc984c7a"),
    "name": "Business 1",
    "boxes": [
        {
            "_id": ObjectId("5ac6bb69f3c36e17f0d34bd2")
        }
    ]
}]

还有另一个名为box的集合,其中包含以下对象:

[{
    _id: ObjectId("5ac6bb69f3c36e17f0d34bd2"),
    name:"Box1",
    color:"blue"
}]

这里的想法是,有些企业拥有盒子,我希望将两个收藏品分开。

那就是说,我想找回这个结果:

[{
    "_id": ObjectId("5aefa97166763d28fc984c7a"),
    "name": "Business 1",
    "boxes": [{
        _id: ObjectId("5ac6bb69f3c36e17f0d34bd2"),
        name:"Box1",
        color:"blue"
    }]
}]

但我得到了这个结果:

[{
    "_id": ObjectId("5aefa97166763d28fc984c7a"),
    "name": "Business 1",
    "boxes": [
        {
            "_id": ObjectId("5ac6bb69f3c36e17f0d34bd2")
        }
    ]
}]

使用$ lookup,如下所示:

db.db('database').collection("business").aggregate({
    $lookup:{
        from: "boxes",
        localField: "_id",
        foreignField: "_id",
        as: "box"
    },
    "$unwind": "$boxes" 
    }).toArray(function(err, result) {
        if (err) throw err; 
        res.send(result);
        db.close();
        res.end();
    });

我做错了什么?

谢谢大家!

2 个答案:

答案 0 :(得分:1)

这应该有帮助

db.business.aggregate([{$lookup:{from: "boxes", localField: "boxes._id", foreignField: "_id", as: "box" }},{"$project":{"_id":1,"name":1,"boxes":"$box"}}])

查找创建一个数组“box”,其中包含来自boxes集合的所有匹配文档。管道中的下一个阶段$ project,从新文档中选择_id和name,并将box数组重命名为box。

答案 1 :(得分:0)

如果您有多个objectId并需要在一个数组框中:

Ex: "boxes": [
        {
            "_id": ObjectId("5ac6bb69f3c36e17f0d34bd2")
        },
       {
            "_id": ObjectId("5ac6bb69f3c36e17f0d34bd3")
        }
    ]

然后你需要做

查询:

db.getCollection('business').aggregate([
    {"$unwind": "$boxes"} ,
    {$lookup:{
        from: "boxes",
        localField: "boxes._id",
        foreignField: "_id",
        as: "box"
    }},
    {
      $group: {
        _id: '$_id',
        name: { $first: '$name' },
        boxes: { 
           $push: {
                  _id: '$boxes._id',
                  name: '$boxes.name'
                   color: '$boxes.color'
                 } 
              }
       }
    }

])