【问题标题】:If object of a nested array in mongodb doesn't have a field, then display default value如果 mongodb 中嵌套数组的对象没有字段,则显示默认值
【发布时间】:2021-08-19 02:30:51
【问题描述】:

1.) 我做了什么

我正在尝试查询 MongoDB 中的数据,如下所示:

"AllData": [
  {
    "name": "Company 1",
    "data": [
      {
        "Brand": "Brand 1", // Brand field present
        "Product Name": "Product 1",
      },
      {
        "Brand": "Brand 1", // Brand field present
        "Product Name": "Product 2",
      },
      {
        "Brand": "Brand 2", // Brand field present
        "Product Name": "Product 1",
      }
    ]
  },
  {
    "name": "Company 2",
    "data": [
      {
        "Product Name": "Product 1", // Brand field not present
      },
      {
        "Product Name": "Product 2", // Brand field not present
      }
    ]
  }
]

正如您在Company 1 中看到的那样,Brand 字段可用,而Company 2 则不可用。 我用来获取数据的查询是:

result = await colc.aggregate([
  { $unwind: "$AllData" },
  { $unwind: "$AllData.data" },
  { $match: {
      $and: [
        {
          "AllData.data.Product Name": { $regex: product, $options: "i"}
        },
        { "AllData.active": true }
      ]
    }
  },
  {
    $project: {
      "AllData.data": 1,
      //  "AllData.data.Brand": { $ifNull: [ "$AllData.data.Brand", "$AllData.name" ] }
    }
  }
])

查询返回嵌套数组中与product 匹配的每个对象作为单独的文档。

效果很好!

2) 我想要达到的目标

对于Company 1,我有一个AllData.data.Brand 字段,而对于Company 2,我没有。 如果对象缺少Brand 字段,则应返回公司名称,即AllData.name 字段。

类似这样的:

"AllData": [
 {
    "name": "Company 2",
    "data": [
      {
        "Brand": "Company 2", // Brand field replaced with Company 2
        "Product Name": "Product 1",        
      }
    ]
 }]

如果我取消注释这一行:

"AllData.data.Brand": { $ifNull: [ "$AllData.data.Brand", "$AllData.name" ] }

我收到一个错误MongoError: Invalid $project :: caused by :: Path collision at AllData.data.Brand remaining portion data.Brand at MessageStream.messageHandler

【问题讨论】:

    标签: node.js arrays json mongodb mongoose


    【解决方案1】:

    出现路径冲突问题是因为在同一个$项目阶段你两次输入了“AllData.data”字段:

    "AllData.data": 1,
    "AllData.data.Brand": { $ifNull: [ "$AllData.data.Brand", "$AllData.name" ] }
    

    尝试使用 addFields 阶段而不是您的注释行:

    $addFields: {
      "AllData.data.Brand": { $ifNull: [ "$AllData.data.Brand", "$AllData.name" ] }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-09
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 2019-05-17
      • 2020-12-07
      • 1970-01-01
      • 2020-02-17
      • 2014-08-12
      相关资源
      最近更新 更多