消费者字段是包含两个对象的数组。使用 $filter
,一个对象被删除,但我需要消费者最后成为对象,但现在它是带有一个对象的数组。我尝试了 $arrayToObject
但无法开始工作。如何将consumer返回为对象?
{
$project: {
messages: 1,
authors: { $concatArrays: ["$userName", "$storeName"] },
consumer: {
$filter: {
input: { $concatArrays: ["$userName", "$storeName"] },
as: "authors",
cond: { $ne: ["$$authors._id", req.user._id] }
}
},
}
}
最佳答案
试试这个:
{
$project: {
messages: 1,
authors: { $concatArrays: ["$userName", "$storeName"] },
consumer: {
$arrayElemAt: [{
$filter: {
input: { $concatArrays: ["$userName", "$storeName"] },
as: "authors",
cond: { $ne: ["$$authors._id", req.user._id] }
}
}, 0]
}
}
}
您可以使用$arrayElemAt直接在 $filter
之后,而不是附加阶段 $unwind
,$filter
通常会返回匹配对象的数组或 []
如果没有匹配,所以如果你使用 $unwind
你需要使用它 { $unwind: { path: "$consumer",preserveNullAndEmptyArrays: true } }
否则,最终聚合响应中可能会丢失文档(其中 consumer
为 []
),请在此处阅读更多相关信息::$unwind 。所以我更喜欢 $arrayElemAt
而不是 $unwind
。
关于node.js - MongoDB 从 $filter 返回一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59737371/