簡體   English   中英

mongoDB - 聚合后按 id 查找

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM