[英]mongoDB - find by id after aggregation
我有一個嵌套數組。 執行聚合以使子數組成為新的根。
Category.aggregate([{$unwind: "$SubCats"}, { $replaceRoot: {newRoot: '$SubCats'}} ])
現在我需要通過 id 查找。
使用它會返回空結果:
Category.aggregate([{$unwind: "$SubCats"}, { $replaceRoot: {newRoot: '$SubCats'}}, {$match: {_id: `${req.params.id}`}} ])
我的 atlas 層不支持使用$elemMatch
。 並使用findById()
給出了這個錯誤'Category.aggregate(...).findById is not a function'
大批:
[
{
_id: '61cae5daf5bfbebd7cf748ee'
title: 'category 1',
SubCats: [
{
_id: '61cae5daf5bfbebd7cf748ef'
name: 'subcat 1',
image: '/assets/images/vr-box-6203301_1920.jpg',
},
{
_id: '61cae5daf5bfbebd7cf748fb'
name: 'subcat 2',
image: '/assets/images/galaxy-s20_highlights_kv_00.jpg',
},
]
},
]
聚合后:
[
{
_id: '61cae5daf5bfbebd7cf748ef'
name: 'subcat 1',
image: '/assets/images/vr-box-6203301_1920.jpg',
},
{
_id: '61cae5daf5bfbebd7cf748fb'
name: 'subcat 2',
image: '/assets/images/galaxy-s20_highlights_kv_00.jpg',
},
]
為什么不將$match
階段移到管道的開頭? 它還將提高管道的性能,因為您不會在許多不相關的文檔上展開和替換 root:
Category.aggregate([ {$match: {_id: `${req.params.id}`}}, {$unwind: "$SubCats"}, { $replaceRoot: {newRoot: '$SubCats'}} ])
如果由於某種原因您不想這樣做,那么您必須在整個管道中保留原始 id 字段,特別是通過$replaceRoot
階段,如下所示:
Category.aggregate([
{
$unwind: "$SubCats"
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
'$SubCats',
{ original_id: "$_id" }
]
}
}
},
{
$match: {original_id: `${req.params.id}`}
}
])
字段_id
是一個ObjectId
,因此查詢必須是這樣的:
Category.aggregate([
{ $unwind: "$SubCats" },
{ $replaceRoot: {newRoot: '$SubCats'} },
{ $match: {_id: ObjectId(`${req.params.id}`) } }
])
但你只需使用
Category.aggregate([
{ $match: {"SubCats._id": ObjectId(`${req.params.id}`) } }
])
或使用$filter
Category.aggregate([
{
$set: {
SubCats: {
$filter: {
input: "$SubCats",
cond: { $eq: ["$$this._id", ObjectId(`${req.params.id}`)] }
}
}
}
}
])
所以我需要從 npm 安裝 mongodb 我最初沒有安裝它,因為我正在連接到雲 mongodb 數據庫。
所以
npm i mongodb
然后導入
import mongodb from 'mongodb'
const {ObjectId} = mongodb
然后這就是有效的:
Category.aggregate([{$unwind: "$SubCats"}, { $replaceRoot: {newRoot: '$SubCats'}}, {$match: {_id: ObjectId(req.params.id)} } ])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.