我正在尝试进行汇总查询,以查找所有不包含特定元素的文档。 需要汇总,因为我希望能够编辑返回的文档。例如。我只想返回一些字段,也希望能够对例如进行分组。 “生产者”元素。
我已经尝试了几乎所有我能想到的。我尝试展开数组,但随后创建了更多文档,其中的PackagingInformation元素比最初的任务更多。我尝试使用$ ne,$ eq,$ gt,$ lte等来查找所需的文档,但是由于嵌套的数组结构,它们总是返回所有文档。 $ ArrayToObject也不适合我。 我对如何实现这一点一无所知。 三重嵌套数组结构超出了我的想象。
唯一返回我所需结果的是以下查询:
db.product.find({
"json.productData.productInformation.details.packagingInformation": { $exists: false }
})
但是这还不够,因为它不是汇总,因此不允许我继续对结果进行查询。 $ exists不能合计使用。
这是我正在努力(虚拟数据)的JSON结构。
{
_id: 5ckflsmdk543klmf543klmtrkmgdfm,
productNumber: 001,
json: {
productData: {
productNumber: 001,
producer: coca-cola,
productInformation: [
{
trackingInformation: {
lastUpdate: 01-01-12,
creationDate: 01-01-11
},
details: [
packagingInformation: [
quantity: 5,
size: 20cm
],
productType: drinks,
otherMeaningLessInformation: whatever,
andEvenMoreInformationInArrays: [
andTheInformationGoesOn: wow,
andOn: nastyArrayStructures
]
]
]
}
}
}
}
所需结果将返回不包含PackagingInformation数组或PackagingInformation.quantity元素的所有文档。
甚至更好,可以返回所有文档,但要有一个额外的字段: containsPackagingInformation:是/否。错误是所有不包含PackagingInformation或PackagingInformation.quantity的文档的结果。
答案 0 :(得分:0)
$exists DOES WORK in a aggregation.
$exists
的工作方式与.find
中的工作方式
您可以形成如下查询:
db.collection.aggregate({ $match: {
$or: [
{
"json.productData.productInformation.details.packagingInformation.quantity": {
$exists: false
}
},
{
"json.productData.productInformation.details.packagingInformation": {
$exists: false
}
}
] } })
使用伪数据尝试此查询here