我有一個嵌套陣列。執行聚合以使子陣列成為新的根。
Category.aggregate([{$unwind: "$SubCats"}, { $replaceRoot: {newRoot: '$SubCats'}} ])
現在我需要通過 id 查找。
使用它會回傳空結果:
Category.aggregate([{$unwind: "$SubCats"}, { $replaceRoot: {newRoot: '$SubCats'}}, {$match: {_id: `${req.params.id}`}} ])
$elemMatch我的 atlas 層不支持using 。并使用findById()給出了這個錯誤'Category.aggregate(...).findById 不是函式'
大批:
[
{
_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',
},
]
uj5u.com熱心網友回復:
為什么不把$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}`}
}
])
uj5u.com熱心網友回復:
欄位_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}`)] }
}
}
}
}
])
uj5u.com熱心網友回復:
所以我需要從 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)} } ])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417233.html
標籤:
