Mongodb: Не ожидаемый результат от агрегата ($ lookup) - PullRequest
0 голосов
/ 16 мая 2018

Мне нужна помощь.

У меня есть коллекция под названием '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 голосов
/ 16 мая 2018

Если у вас несколько objectIds и вам нужно в одном массиве. Boxes:

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'
                 } 
              }
       }
    }

])
0 голосов
/ 16 мая 2018

Это должно помочь

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

При поиске создается массив "box", в котором содержатся все совпадающие документы из коллекции коробок. На следующем этапе в конвейере, $ project, выбирается _id и name из нового документа и переименовывается массив box в боксы.

...