Поиск MongoDB с условиями

Извините за то, что я уверен, что это вопрос новичка, но после пары презентаций я совершенно не понимаю, как к этому подойти.

Сейчас у меня две коллекции, одна orders, а другая offers. Предложения в основном представляют собой предложения по котировкам заказов (связанные _id<->orderId).

Пример сбора заказов:

{ 
    "_id" : ObjectId("59311d8ba0ea6500113df5d6"), 
    "deleted" : true, 
    "updated" : ISODate("2017-06-02T08:20:47.772+0000"), 
    "created" : ISODate("2017-06-02T08:10:51.401+0000"), 
    "name" : "Sicherungsbolzen",
    "state" : "active"
}
{ 
    "_id" : ObjectId("59311ee2a0ea6500113df5d8"), 
    "deleted" : false, 
    "updated" : ISODate("2017-06-02T08:16:34.911+0000"), 
    "created" : ISODate("2017-06-02T08:16:34.911+0000"), 
    "name" : "Mitnehmerstein SK50 ",
    "state" : "active"
}

Пример коллекции цитат:

{ 
    "_id" : ObjectId("59311ee2a0ea6500113df5d8"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-08T13:18:34.872+0000"), 
    "created" : ISODate("2019-11-08T06:54:14.072+0000"), 
    "orderId" : ObjectId("5db6c679d8499800286ff64a"), 
    "proposal" : {
        "price" : NumberInt(19800), 
        "currency" : "CUR51", 
        "deliveryDate" : NumberInt(21), 
        "files" : [

        ]
    }, 
}
{ 
    "_id" : ObjectId("59311d8ba0ea6500113df5d6"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-08T10:11:48.112+0000"), 
    "created" : ISODate("2019-10-29T11:31:05.980+0000"), 
    "orderId" : ObjectId("5db74034d849980028701a95"), 
    "proposal" : {
        "price" : 31.78, 
        "currency" : "CUR48", 
        "deliveryDate" : NumberInt(1), 
        "files" : [

        ]
    }
}
{ 
    "_id" : ObjectId("59311d8ba0ea6500113df5d6"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-08T08:37:04.354+0000"), 
    "created" : ISODate("2019-11-08T08:37:04.354+0000"), 
    "orderId" : ObjectId("5db80b84ed142100263a5088"), 
    "proposal" : {
        "price" : NumberInt(2345), 
        "deliveryDate" : NumberInt(18), 
        "currency" : "CUR48", 
        "files" : [

        ]
    }, 
}
{ 
    "_id" : ObjectId("59311d8ba0ea6500113df5d6"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-15T14:32:15.958+0000"), 
    "created" : ISODate("2019-11-06T14:42:23.492+0000"), 
    "orderId" : ObjectId("5dc03382751ecc002899e1fa"), 
    "proposal" : {
        "price" : NumberInt(86400), 
        "currency" : "CUR48", 
        "deliveryDate" : NumberInt(90), 
        "files" : [

        ]
    }
}
{ 
    "_id" : ObjectId("59311d8ba0ea6500113df5d6"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-22T23:10:07.056+0000"), 
    "created" : ISODate("2019-11-06T20:09:20.706+0000"), 
    "orderId" : ObjectId("5dc03382751ecc002899e1fa"), 
    "proposal" : {
        "price" : NumberInt(57419), 
        "currency" : "CUR48", 
        "deliveryDate" : NumberInt(27), 
        "files" : [

        ]
    }
}
{ 
    "_id" : ObjectId("59311d8ba0ea6500113df5d6"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-08T08:52:18.910+0000"), 
    "created" : ISODate("2019-11-08T08:52:18.910+0000"), 
    "orderId" : ObjectId("5dc05c0a751ecc00289a0187"), 
    "proposal" : {
        "price" : NumberInt(9900), 
        "deliveryDate" : NumberInt(35), 
        "currency" : "CUR48", 
        "files" : [

        ]
    }, 
}
{ 
    "_id" : ObjectId("59311d8ba0ea6500113df5d6"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-08T09:39:12.383+0000"), 
    "created" : ISODate("2019-11-08T09:39:12.383+0000"), 
    "orderId" : ObjectId("5dc47fb10a1f7c00262763e3"), 
    "proposal" : {
        "price" : NumberInt(79), 
        "deliveryDate" : NumberInt(7), 
        "currency" : "CUR48", 
        "files" : [

        ]
    }, 
}
{ 
    "_id" : ObjectId("59311ee2a0ea6500113df5d8"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-08T09:45:41.392+0000"), 
    "created" : ISODate("2019-11-08T09:45:41.392+0000"), 
    "orderId" : ObjectId("5dc480ab751ecc00289b32c7"), 
    "proposal" : {
        "price" : NumberInt(240), 
        "deliveryDate" : NumberInt(7), 
        "currency" : "CUR48", 
        "message" : "Hi Alex, I saw you put several RFQs in the platform,attached quotation for reference.If you have any question,please contact me at [email protected]. Looking forward to your feedback.By the way,may I know your email?\n\nRebecca", 
        "files" : [

        ]
    }, 
}
{ 
    "_id" : ObjectId("59311ee2a0ea6500113df5d8"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-08T09:43:29.928+0000"), 
    "created" : ISODate("2019-11-08T09:43:29.928+0000"), 
    "orderId" : ObjectId("5dc482430a1f7c00262763e6"), 
    "proposal" : {
        "price" : NumberInt(390), 
        "deliveryDate" : NumberInt(7), 
        "currency" : "CUR48", 
        "message" : "Hi Alex, I saw you put several RFQs in the platform,attached quotation for reference.If you have any question,please contact me at [email protected]. Looking forward to your feedback.By the way,may I know your email?\n\nRebecca", 
        "files" : [

        ]
    }, 
}
{ 
    "_id" : ObjectId("59311ee2a0ea6500113df5d8"), 
    "deleted" : false, 
    "updated" : ISODate("2019-11-08T06:56:15.346+0000"), 
    "created" : ISODate("2019-11-08T06:56:15.346+0000"), 
    "orderId" : ObjectId("5dc4843b0a1f7c00262763ed"), 
    "proposal" : {
        "price" : NumberInt(3), 
        "deliveryDate" : NumberInt(7), 
        "currency" : "CUR48", 
        "files" : [

        ]
    }, 
}

У меня есть главная цель: экспортировать файл Excel, который будет отображать "среднее" значение цены за предложение. То есть, если ордер получил 3 котировки (20, 30, 40) это будет: OrderID, 30 (т.е. 30 среднее из 20, 30, 40).

В этом случае, имея 2 заказа (59311d8ba0ea6500113df5d6 и 59311ee2a0ea6500113df5d8), он должен отображать:

ORDERID, AVERAGE OF PRICE

59311ee2a0ea6500113df5d8, 99 (average all the proposal.price for each quote of this order)
59311d8ba0ea6500113df5d6, 129 (average all the proposal.price for each quote of this order)

Есть подсказки, советы, помощь?

заранее спасибо


person victorgonal    schedule 27.02.2020    source источник
comment
Предоставьте образцы данных и ожидаемые результаты в обоих случаях.   -  person Valijon    schedule 27.02.2020
comment
being 90 the average of 20, 30, 40 это опечатка или вы имели в виду sum?   -  person Joe    schedule 28.02.2020
comment
Это действительно опечатка извините. Исправляем сейчас.   -  person victorgonal    schedule 28.02.2020


Ответы (1)


Это похоже на задание для нового $lookup

db.Orders.aggregate([
 {$project:{_id:1}),
 {$lookup: {
     from: "Quotes",
     let: {order:"$_id"},
     pipeline: [
        {$match: {$expr: {$eq:["$orderId","$$order"]}}},
        {$group: {_id:null, average:{$avg:"$proposal.price"}}}
     ],
     as: "quotes"
 }}
])

Это должно возвращать такие документы, как

{_id: ObjectId("..."),
quotes:[{_id:null, average:xxx}]}
person Joe    schedule 28.02.2020