gpt4 book ai didi

node.js - MongoDB 中两个集合的 $aggregation、$sum

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:00 25 4
gpt4 key购买 nike

嗨,假设我有这两个集合

样本1:

 {
"_id" : {
"date" : ISODate("2020-02-11T18:30:00Z"),
"price" : 4,
"offer" : 0,
"itemCode" : "A001"
"customerId" : ObjectId("5e43de778b57693cd46859eb"),
"sellerId" : ObjectId("5e43e5cdc11f750864f46820"),
},
"charges" : 168
}
{
"_id" : {
"date" : ISODate("2020-02-11T18:30:00Z"),
"coverPrice" :5.5 ,
"offer" : 38,
"itemCode" : "B001"
"customerId" : ObjectId("5e43de778b57693cd46859eb"),
"sellerId" : ObjectId("5e43e5cdc11f750864f46820"),
},
"charges" : 209.5
}

注意:sample1 的 _id 没有任何 ObjectId()

样本2:

        {
"paymentReceivedOnDate" : ISODate("2020-02-12T18:30:00Z"),
"customerId" : ObjectId("5e43de778b57693cd46859eb"),
"sellerId" : ObjectId("5e43e5cdc11f750864f46820"),
"amount" : 30,
}
{
"paymentReceivedOnDate" : ISODate("2020-02-12T18:30:00Z"),
"customerId" : ObjectId("5e43de778b57693cd46859eb"),
"sellerId" : ObjectId("5e43e5cdc11f750864f46820"),
"amount" : 160,
}
{
"paymentReceivedOnDate" : ISODate("2020-02-11T18:30:00Z"),
"customerId" : ObjectId("5e43de778b57693cd46859eb"),
"sellerId" : ObjectId("5e43e5cdc11f750864f46820"),
"amount" : 50,
}

我的问题陈述:

1: 首先,我需要计算样本 1 集合的总费用。针对 [日期、客户 ID、卖家 ID]

2: 其次,我需要计算样本 2 集合中的总金额。

3:比我需要计算未付款项,即[totalCharges -totalAmount]。

4:最后也是最重要的是,我需要将预测结果保存到一个新集合中,假设“结果”具有以下字段-['customerId','sellerId','date',' TotalCharges','未结金额'(即:[totalCharges - 总金额]),'totalAmount'。

最佳答案

您可以尝试以下查询:

db.sample1.aggregate([
/** groups data & sum up charges */
{ $group: { _id: { date: '$_id.date', customerId: '$_id.customerId', sellerId: '$_id.sellerId' }, totalCharges: { $sum: '$charges' } } },
/** finds matching docs from sample2 */
{
$lookup:
{
from: "sample2",
let: { customerId: '$_id.customerId', sellerId: '$_id.sellerId' },
pipeline: [
{
$match:
{
$expr:
{
$and:
[
{ $eq: ["$customerId", "$$customerId"] },
{ $eq: ["$sellerId", "$$sellerId"] }
]
}
}
},
{ $project: { amount: 1, _id: 0 } }
],
as: "TotalAmount" // TotalAmount is an array of objects, each object will have just amount field in it.
}
},
/** retains only needed fields */
{
$project: {
totalCharges: 1, outstanding: {
$subtract: ['$totalCharges', {
$reduce: {
input: '$TotalAmount',
initialValue: 0,
in: { $add: ["$$value", "$$this.amount"] }
}
}]
}, TotalAmount: {
$reduce: {
input: '$TotalAmount',
initialValue: 0,
in: { $add: ["$$value", "$$this.amount"] }
}
}
}
}
])

测试: MongoDB-Playground

引用: aggregation-pipeline

注意:在聚合结束时,您可以有 $merge$out将聚合结果写入新集合的阶段,如果您的 MongoDB v >=4.2 则更喜欢 $merge 因为它会将字段合并到现有文档/将新文档添加到现有集合或如果没有找到给定名称的集合,它将创建新集合,但如果提供的集合名称已存在,则 $out 将完全替换现有集合,或者使用提供的名称创建新集合。

关于node.js - MongoDB 中两个集合的 $aggregation、$sum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60315073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com