如何在 Mongodb 中对多个数组使用聚合映射和过滤器
Posted
技术标签:
【中文标题】如何在 Mongodb 中对多个数组使用聚合映射和过滤器【英文标题】:How to use aggregate map and filter for multiple arrays in Mongodb 【发布时间】:2020-08-04 23:32:00 【问题描述】:这里我有两个数组,
Usercar = [
parentId :001
cars:[
_id: 1, name: bmw, color: red,
_id: 2, name: Ford, color: black,
_id: 3, name: Volkswagen, color: black,
]
]
Userfavorite =
[
parentId :001,
favoriteCars:[1,3] //mongoose.Types.ObjectId
]
我想使用 mongodb 聚合显示用户最喜欢的汽车,这是我的代码
let carsId= [1,3];
$match:
parentId :001
,
$project:
cars:
$filter:
input:"$cars",
as :'cars',
cond: $eq :["$$cars._id", mongoose.Types.ObjectId('1')]
//cond: $eq :["$$cars._id", carsId]
上面的代码只工作,当传递单个carsId时,我想从Usercar的集合中获取用户最喜欢的Cars详细信息,如何在mongodb聚合中做到这一点?
【问题讨论】:
@neil-lunn 请看一下Usercar
和 Userfavorite
是在同一个文档中,还是在不同的集合中?
它的独立收藏
【参考方案1】:
可以做到这一点的一种可能的聚合是:
在 Usercar 集合上聚合 从 Userfavorite 集合中查找匹配的文档 如果有多个收藏文档,请将它们合并到一个收藏数组中 减少汽车集合以找到与收藏夹匹配的集合,然后添加到数组中db.Usercar.aggregate([
$lookup:
from: "Userfavorite",
localField: "parentId",
foreignField: "parentId",
as: "favorite"
,
$set:
favorite:
$arrayElemAt: [
$concatArrays: "$favorite.favoriteCars",
0
]
,
$addFields:
favoriteCarDetails:
$filter:
input: "$cars",
cond:
$in: [
"$$this._id",
"$favorite"
]
])
Playground
【讨论】:
favoriteCarDetails
为空:(
为什么我们需要 concatArrays ?
您不一定,这只是处理另一个集合中有 2 个匹配文档的可能性。如果只有一个,您可以将其投影或展开以将其从查找的数组中拉出以上是关于如何在 Mongodb 中对多个数组使用聚合映射和过滤器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MongoDB 中对聚合查询结果进行分页并获得总文档数(Node.js + Mongoose)?