【问题标题】:MongoDB Lookup with Conditions带有条件的 MongoDB 查找
【发布时间】:2020-02-27 14:25:04
【问题描述】:

很抱歉,我确定这是一个新手问题,但经过几个讲台后,我完全不知道如何解决这个问题。

我目前有两个系列,一个是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 engineer07@top-rp.cn. 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 engineer07@top-rp.cn. 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)

任何提示、技巧、帮助?

提前致谢

【问题讨论】:

  • 请提供两种情况下的样本数据和预期结果
  • being 90 the average of 20, 30, 40 是错字还是您的意思是 sum
  • 这确实是一个错字对不起。现在更正它。

标签: mongodb aggregation-framework lookup


【解决方案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}]}

【讨论】:

    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2020-10-16
    • 2019-06-14
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多