有一种更好的方法可以使用 MongoDB 获得所需的结果,并且无需循环,使用聚合框架,您可以在其中运行以下管道,该管道使用$facet https://docs.mongodb.com/manual/reference/operator/aggregation/facet/ as
try {
const array = ["brunch", "lunch", "crunch"]
const facet = array.reduce((acc, cur) => {
acc[cur] = [{ "$match": { "category": cur } }]
return acc
}, {})
const pipeline = [
{ "$match": { "category": { "$in": array } } },
{ "$facet": facet }
]
const results = await Venue.aggregate(pipeline).exec()
const data = results[0]
return data
} catch(err) {
throw err
}
您还可以按类别键对文档进行分组$push https://docs.mongodb.com/manual/reference/operator/aggregation/push/每组的文档,然后转换为文档中的键$replaceRoot https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/ with $arrayToObject https://docs.mongodb.com/manual/reference/operator/aggregation/arrayToObject/
try {
const array = ["brunch", "lunch", "crunch"]
const pipeline = [
{ "$match": { "category": { "$in": array } } },
{ "$group": {
"_id": "$category",
"data": { "$push": "$$ROOT" }
} },
{ "$group": {
"_id": null,
"venues": {
"$push": {
"k": "$_id",
"v": "$data"
}
}
} },
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$venues" }
} }
]
const results = await Venue.aggregate(pipeline).exec()
const data = results[0]
return data
} catch(err) {
throw err
}