Вычесть свойство документа в коллекции из свойства другого документа в другой коллекции и вернуть массив разностей - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть коллекция под названием A, где есть массив продуктов, и у меня есть коллекция B, которая также имеет массив продуктов, отношение A & B - один ко многим по _id, для каждого документа в A может быть несколько документов в B, также массив продуктов B состоит только из продуктов из продукта A массив.

Это коллекция А

    {
    "_id": "abcdefg",
    "products": [
        {
            "_id": "1",
            "_product": "1",
            "quantity": 12
        },
        {
            "_id": "2",
            "_product": "2",
            "quantity": 32
        },
        {
            "_id": "3",
            "_product": "3",
            "quantity": 12
        }
    ]
}

Это два документа в B Док 1

{
"_id": "<<obj_id>>",
"A_id":"abcdefg",
"products": [
    {
        "_id": "<<_id>>",
        "_product": "1",
        "quantity": 6
    },
    {
        "_id": "<<_id>>",
        "_product": "2",
        "quantity": 16
    }
]
}

и DOC 2

{
"_id": "<<obj_id>>",
"A_id":"abcdefg",
"products": [
    {
        "_id": "1",
        "_product": "1",
        "quantity": 6
    },
    {
        "_id": "2",
        "_product": "2",
        "quantity": 12
    },
    {
        "_id": "3",
        "_product": "3",
        "quantity": 8
    }
]
}

Теперь мне нужен конвейер / стратегия, в которой я могу получить разницу количеств продуктов А и (сумму всех продуктов B), где идентификаторы продуктов равны, т.е. что-то вроде этого

[
  0,
  4,
  4
]

1 Ответ

0 голосов
/ 13 сентября 2018

После 2 часов шлифовки наконец-то заставил его работать как-то.

db.collectionb.aggregate([
{
  $unwind: "$products"
},
{
  $lookup:{
    from:"collectiona",
    localField:"A_id",
    foreignField:"_id",
    as:"colaref"
  }
},
{
 $unwind: "$colaref"
},
{
 $unwind:"$colaref.products"
},
{
 $project:{
  colaProducts:"$colaref.products",
  products:"$products",
  idEq:{ $eq:["$colaref,products._id","$products._id"]}
 }
},
{
 $match:{
  idEq: true
 }
},
{
 $project:{
  quantity:{
   $subtract:["$colaProducts.quantity","$products.quantity"]
  }
 }
}
])

если я добавлю совпадение для идентификатора документа CollectionB, я получу то, что хотел.

...