如果 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 中增加嵌套字段值或创建嵌套字段