如果 mongodb 中嵌套数组的对象没有字段,则显示默认值

Posted

技术标签:

【中文标题】如果 mongodb 中嵌套数组的对象没有字段,则显示默认值【英文标题】:If object of a nested array in mongodb doesn't have a field, then display default value 【发布时间】: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

【问题讨论】:

【参考方案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" ] 

【讨论】:

以上是关于如果 mongodb 中嵌套数组的对象没有字段,则显示默认值的主要内容,如果未能解决你的问题,请参考以下文章

带有 C#Driver 的 MongoDB:如何过滤嵌套对象数组中的字段

mongoDB对嵌套对象数组的聚合查找

如果存在,则在 mongodb 中增加嵌套字段值或创建嵌套字段

如果存在,则在 mongodb 中增加嵌套字段值或创建嵌套字段

如果未找到值,则使用 mongoose 将对象添加到数组中,否则更新字段

MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中