访问 mongodb 聚合中对象数组中每个对象的相同字段
Access same field of every object in array of objects in mongodb aggregation
我在 mongodb 中收集了以下文档:
banks:[{name:"ABC", amt:0},{name:"PQR", amt:-1},{name"XYZ", amt:3400}]
banks:[{name:"ABC", amt:-2},{name:"PQR", amt:2344},{name"XYZ", amt:7600}]
这样说我有 10 个文档,每个文档包含一个 banks 数组。如上所示,每个 banks 数组中有 30 个对象。
我正在尝试在 mongodb 中编写聚合查询以获取“amt”小于等于零且大于零但到目前为止无法获取的对象的计数。请帮忙。提前致谢!
上述示例文档的输出应该是
{"greaterThanZero": 1, "lessThanEqualToZero": 2 }
{"greaterThanZero": 2, "lessThanEqualToZero": 1 }
首先你必须用 $unwind
分隔你的文档
然后用 $project
和 $cond
告诉每个文档是 greaterThanZero
还是 lessThanEqualToZero
最后你用 $group
总结了 greaterThanZero
和 lessThanEqualToZero
您可以在这里进行测试:Mongo Playground
[
{
"$unwind": "$banks"
},
{
"$project": {
"greaterThanZero": {
"$cond": [
{
"$gt": [
"$banks.amt",
0
]
},
1,
0
]
},
"lessThanEqualToZero": {
"$cond": [
{
"$lte": [
"$banks.amt",
0
]
},
1,
0
]
}
}
},
{
"$group": {
"_id": "$_id",
"greaterThanZero": {
"$sum": "$greaterThanZero"
},
"lessThanEqualToZero": {
"$sum": "$lessThanEqualToZero"
}
}
}
]
你可以用 $reduce,
- 它使用 $cond 检查条件,如果匹配则将值加一,
db.collection.aggregate([
{
$project: {
lessThanEqualToZero: {
$reduce: {
input: "$banks",
initialValue: 0,
in: {
$cond: [
{ $lte: ["$$this.amt", 0] },
{ $add: ["$$value", 1] },
"$$value"
]
}
}
},
greaterThanZero: {
$reduce: {
input: "$banks",
initialValue: 0,
in: {
$cond: [
{ $gt: ["$$this.amt", 0] },
{ $add: ["$$value", 1] },
"$$value"
]
}
}
}
}
}
])
我在 mongodb 中收集了以下文档:
banks:[{name:"ABC", amt:0},{name:"PQR", amt:-1},{name"XYZ", amt:3400}]
banks:[{name:"ABC", amt:-2},{name:"PQR", amt:2344},{name"XYZ", amt:7600}]
这样说我有 10 个文档,每个文档包含一个 banks 数组。如上所示,每个 banks 数组中有 30 个对象。
我正在尝试在 mongodb 中编写聚合查询以获取“amt”小于等于零且大于零但到目前为止无法获取的对象的计数。请帮忙。提前致谢!
上述示例文档的输出应该是
{"greaterThanZero": 1, "lessThanEqualToZero": 2 }
{"greaterThanZero": 2, "lessThanEqualToZero": 1 }
首先你必须用 $unwind
然后用 $project
和 $cond
告诉每个文档是 greaterThanZero
还是 lessThanEqualToZero
最后你用 $group
greaterThanZero
和 lessThanEqualToZero
您可以在这里进行测试:Mongo Playground
[
{
"$unwind": "$banks"
},
{
"$project": {
"greaterThanZero": {
"$cond": [
{
"$gt": [
"$banks.amt",
0
]
},
1,
0
]
},
"lessThanEqualToZero": {
"$cond": [
{
"$lte": [
"$banks.amt",
0
]
},
1,
0
]
}
}
},
{
"$group": {
"_id": "$_id",
"greaterThanZero": {
"$sum": "$greaterThanZero"
},
"lessThanEqualToZero": {
"$sum": "$lessThanEqualToZero"
}
}
}
]
你可以用 $reduce,
- 它使用 $cond 检查条件,如果匹配则将值加一,
db.collection.aggregate([
{
$project: {
lessThanEqualToZero: {
$reduce: {
input: "$banks",
initialValue: 0,
in: {
$cond: [
{ $lte: ["$$this.amt", 0] },
{ $add: ["$$value", 1] },
"$$value"
]
}
}
},
greaterThanZero: {
$reduce: {
input: "$banks",
initialValue: 0,
in: {
$cond: [
{ $gt: ["$$this.amt", 0] },
{ $add: ["$$value", 1] },
"$$value"
]
}
}
}
}
}
])