如何在mongoDB中查询嵌套数组以查找包含不存在的元素的文档

时间:2019-11-02 16:15:19

标签: mongodb

我正在尝试进行汇总查询,以查找所有不包含特定元素的文档需要汇总,因为我希望能够编辑返回的文档。例如。我只想返回一些字段,也希望能够对例如进行分组。 “生产者”元素。

我已经尝试了几乎所有我能想到的。我尝试展开数组,但随后创建了更多文档,其中的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的文档的结果。

1 个答案:

答案 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