gpt4 book ai didi

mongodb - 返回满足子查询结果集的文档

转载 作者:可可西里 更新时间:2023-11-01 10:46:38 25 4
gpt4 key购买 nike

我正在尝试解决在 Sql Server 中需要公用表表达式或子查询的问题。

我有一个名为 Invoice_Details 的集合。每个文档都有一个 InvoiceID、CustomerID、TransactionDate 和 TransactionAmount 字段。

我想要做的是取回当 TransactionAmount 聚合时不等于零的所有文档。

我正在做如下分组:

   db.Invoice_Details.aggregate(
[
{
$group:
{
_id: { InvoiceID: "$InvoiceID"},
Balance: { $sum: "$TransactionAmount"}
}
},
{ $match: { Balance: { $ne: 0 } } }
]
)

这产生了

{
"_id" : {
"InvoiceID" : "234904"
},
"Balance" : 182.67
}

.... 数以百计的附加文档,这很棒。

我现在想做的是获取汇总返回的所有 invoice_details 文档。

在 Sql Server 中,我会重新加入公用表表达式/子查询的结果,但我不确定如何(如果?)我可以执行此 mongo。

最佳答案

那么你可以做一个 "$lookup"基于 "InvoiceID" 并立即 $unwind结果,以防万一我们谈论的文档结果足够大,实际上可能会违反 BSON 限制;

db.Invoice_Details.aggregate([
{ "$group": {
"_id": "$InvoiceID",
"balance": { "$sum": "$TransactionAmount" }
}},
{ "$match": { "balance": { "$ne": 0 } } },
{ "$lookup": {
"from": "Invoice_Details",
"localField": "_id",
"foreignField": "InvoiceID",
"as": "details"
}},
{ "$unwind": "$details" },
{ "$replaceRoot": { "newRoot": "$details" } }
])

理想情况下你会 $replaceRoot这里只是将包含所有结果的字段提升到文档根目录中。否则使用 $project如果您的 MongoDB 版本低于 3.4 且缺少管道阶段,则命名所有字段:

  { "$project": {
"_id": "$details._id",
"InvoiceID": "$details.InvoiceID",
"CustomerID": "$details.CustomerID",
"TransactionDate": "$details.TransactionDate",
"TransactionAmount": "$details.TransactionAmount"
}}

但本质上是在做 "$lookup"这里实际上是 “InvoiceID” 上的“子查询”和连接条件,只是 MongoDB 以不同的顺序呈现它。所以“顺序”为“先聚合”然后加入。

关于mongodb - 返回满足子查询结果集的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50175130/

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