数组中对象字段上的MongoDB筛选器
我收集了以下结构的文档,这里只包括两个文档。所有文件包括field1和array1。虽然文档中数组1内的对象数量不同,但字段_1和字段_2始终存在于对象中数组中对象字段上的MongoDB筛选器,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我收集了以下结构的文档,这里只包括两个文档。所有文件包括field1和array1。虽然文档中数组1内的对象数量不同,但字段_1和字段_2始终存在于对象中 { "_id": "1", "field1": "A", "array1": { "object1": { "field_1": "true", "field_2": "test" }, "object2": { "field_1": "false", "fi
{
"_id": "1",
"field1": "A",
"array1": {
"object1": {
"field_1": "true",
"field_2": "test"
},
"object2": {
"field_1": "false",
"field_2": "test"
}
}
}
{
"_id": "2",
"field1": "A",
"array1": {
"object1": {
"field_1": "true",
"field_2": "test"
},
"object2": {
"field_1": "true",
"field_2": "test"
},
"object3": {
"field_1": "false",
"field_2": "test"
}
}
}
{
"_id": "3",
"field1": "B",
"array1": {
"object1": {
"field_1": "true",
"field_2": "test"
},
"object2": {
"field_1": "false",
"field_2": "test"
}
}
}
我试图进行一个查询,对于field1=a的每个文档,只返回field1和数组1中布尔字段_1为真的对象计数。除了这里包含的字段和数组之外,文档中还有更多的字段和数组,因此重要的是我只检索指定的字段和数组,而不是检索所有的字段和数组。因此,在本例中,我将得出以下结论:
{
"_id": "1",
"field1": "A",
"array1": "1"
}
{
"_id": "2",
"field1": "A",
"array1": "2"
}
我一直在测试下面的这个查询,但不知道哪里出了问题。然而,我可以看到计数总是等于零,所以有点不对劲
db.collection.aggregate([
{ "$match": { "field1": "A" }},
{ "$addFields": {
"array1": {
"$size": {
"$filter": {
"input": "$array1",
"cond": { "$eq": ["$$this.v.field_1", "true"] }
}
}
}
}}
])
非常感谢您的帮助 您需要更新的只是这个{$eq:[$$this.v.field_1,true]}到{$eq:[$$this.field_1,true]},在数组字段array1中没有称为字段v的东西,也可以更改为$project而不是$addFields,以便在输出中只包含字段1、\u id和array1。试试这个:
db.collection.aggregate([{ $match: { field1: 'A' } }, {
$project: {
field1: 1, array1: {
$size: {
$filter: {
"input": "$array1",
"as": 'each',
"cond": { "$eq": ["$$each.field_1", "true"] }
}
}
}
}
}])
数组类型1字段是否为数组?是。array1字段的类型是数组,而对象字段是对象。你应该给出实际的文档,因为在这个问题的给定状态下,array1看起来不像数组,而是一个对象。这个object1东西也很混乱。这给了我一个一开始看起来正确的输出,但字段数组1的输出中只有零。所以肯定少了一些东西。@CHRD:你能给我实际的文档而不是手动生成的JSON吗。。该文档是否类似于{u id:1,field1:A,array1:[{field_1:true,field_2:test},{field_1:false,field_2:test}]}??实际文件非常凌乱,所以我尽量保持整洁。当我把报价单放在周围时,它似乎起作用了。谢谢。我有一个问题中提到的布尔值。所以放弃报价是可行的。