【发布时间】: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