Arrays MongoDB项目数组文档大小与条件
假设我有以下文档结构:Arrays MongoDB项目数组文档大小与条件,arrays,mongodb,aggregation-framework,Arrays,Mongodb,Aggregation Framework,假设我有以下文档结构: { "_id": "ID", "array": [ { "a": "A", "b": "B", "c": { "x": true, "y": true, "z": false } }, { "a": "A", "b": "B" }, { "a": "A", "b": "B"
{
"_id": "ID",
"array": [
{
"a": "A",
"b": "B",
"c": {
"x": true,
"y": true,
"z": false
}
},
{
"a": "A",
"b": "B"
},
{
"a": "A",
"b": "B"
"c": {
"s": true
}
}
]
}
我正在尝试进行一次聚合,该聚合为我提供了这种类型的输出:
{
"_id": "ID",
"array": [
{
"a": "A",
"b": "B",
"c": 2
},
{
"a": "A",
"b": "B",
"c": 0
},
{
"a": "A",
"b": "B"
"c": 1
}
]
}
因此,我要做的是,而不是文档c
,返回true
作为值的元素数。与示例中一样,c
字段不一定存在(在这种情况下,我想返回0),当它存在时,它的子字段不一定与数组中的其他c
子字段相同。假设我正在进行聚合:
db.collection.aggregate([
{"$match": {<conditions>}},
{"$project": {
"array.a": 1,
"array.b": 1,
"array.c": <?>,
}}
])
db.collection.aggregate([
{“$match”:{},
{“$project”:{
“array.a”:1,
“array.b”:1,
“array.c”:,
}}
])
如何在投影中调整
“array.c”
,以实现我的目标?您至少需要有MongoDB v3.4.4
投影“array.a”:1
将返回[“a”、“a”、“a”]
。
由于您的数组
字段是一个数组,我们需要使用$map
运算符进行迭代
要迭代对象键,我们需要使用运算符将其转换为数组
"c": { "c": [
"x": true, {k: "x", v: true},
"y": true, -> {k: "y", v: true},
"z": false {k: "z", v: false},
} ]
然后,我们应用$filter
操作符来获得k:v
对,其v
为true
聚合投影操作符可以将
c
对象转换为数组,并且可以计算数组元素。
db.collection.aggregate([
{
$match: {}
},
{
$project: {
array: {
$map: {
input: "$array",
as: "arr",
in: {
a: "$$arr.a",
b: "$$arr.b",
c: {
$size: {
$filter: {
input: {
$objectToArray: {
$ifNull: [
"$$arr.c",
{}
]
}
},
cond: {
$eq: [
"$$this.v",
true
]
}
}
}
}
}
}
}
}
}
])