mongodb - 猫鼬聚合直到文档总和等于某个值
问题描述
180
在我达到总和并获得_ids之前,我可以使用什么管道来选择所有id 。下面是我已经过滤掉的数据示例。在这种情况下,它应该选择前两项。
[
{
"_id": "6048b2b190422d0066d90740",
"Code": "A0ABI61YH",
"Amount": 100
},
{
"_id": "6048b3cc7e4b350072424f4c",
"Code": "A0ABEAXX6",
"Amount": 100
},
{
"_id": "6048b5167e4b350072424f50",
"Code": "A0ABCENPD",
"Amount": 100
}
]
解决方案
我认为没有任何直接的方法可以实现这一点,如果您真的想尝试,这仅在您的数据大小低于 16MB 时才有效,因为我们要将您的文档分组到数组中的文档中,其次这可能导致性能问题,
$group
按 null 并将所有文档和必填字段 (_id
,Amount
) 分组在result
$reduce
result
迭代数组 的循环,initialValue
声明初始值为Amount
0 且result
为 []in
检查条件,如果 initialValue 的 Amount 小于 180,则连接当前对象的 _id 和 initialValue 的 _ids 使用$concatArrays
并求和当前对象的 Amount 和 initialValue 的 Amount,否则返回相同的值
db.collection.aggregate([
{
$group: {
_id: null,
result: {
$push: {
_id: "$_id",
Amount: "$Amount"
}
}
}
},
{
$project: {
_id: 0,
result: {
$reduce: {
input: "$result",
initialValue: { Amount: 0, _ids: [] },
in: {
$cond: [
{ $lt: ["$$value.Amount", 180] },
{
_ids: { $concatArrays: ["$$value._ids", ["$$this._id"]] },
Amount: { $sum: ["$$value.Amount", "$$this.Amount"] }
},
"$$value"
]
}
}
}
}
}
])
推荐阅读
- java - 使用 Spring MVC 提供静态内容和渲染 JSP
- javascript - 动态绑定图像Angular 8
- excel - Excel VBA 将日期翻译成另一种格式
- apollo - 在 nextJS 上配置 apollo 客户端以进行订阅的问题
- class - 为什么 Dephi 将 Record 作为值类型,而将类作为引用类型?
- laravel - @auth 指令在 @endauth 之后丢弃 html 块
- reactjs - 在 typescript 中将 props 传递给 HOC
- sas - 对我的示例字符串使用 compged 的 compcost 操作是什么
- labview - 如何在labview中连接到oracleXE18C?
- python - 一系列替换函数的统一函数