使用_id查找不适用于聚合[重复]

Posted

技术标签:

【中文标题】使用_id查找不适用于聚合[重复]【英文标题】:Find using _id not working with aggregation [duplicate] 【发布时间】:2019-03-23 00:07:08 【问题描述】:

我是 mongodb 的初学者,我正在尝试在 node.js 应用程序中使用 mongoose 编写查询:

const objectIdValue = secondId.valueOf();


  const existedRelation = await this.model.aggregate([
     $match:  _id: firstId  ,
     $project: 
      relations: 
        $filter: 
          input: '$links',
          as: 'link',
          cond: 
            $and: [
               $eq: ['$$link.target.entityId', `$objectIdValue`] ,
               $eq: ['$$link.linkTypeId', linkTypeId] ,
            ],
          ,

        ,
      ,
    ,
    ,
  ]);
  console.log('existedRelation: ', existedRelation);

当我执行它时,我得到了这个结果:

existedRelation:  []

我尝试使用 mongoShell 执行它:

db.tasks.aggregate([
     $match: _id: ObjectId("5bbf5800be37394f38a9727e") ,
    
  $project: 
          relations:
                $filter:
                  input: '$links',
                  as: "link",
                  cond: 
                                  $and: [
                                  $eq:["$$link.target.entityId", '5bbf52eabe37394f38a97276'],
                                  $eq: ["$$link.linkTypeId", ObjectId("5bbf4bfcb075e03bd4a1b779")]
                                  ]
                                  

                
              
            
          

我得到了我想要的结果。我犯了什么错误?

【问题讨论】:

【参考方案1】:

Mongoose 不会在聚合函数中将 String 转换为 ObjectId。所以你必须使用猫鼬手动投射它。

var mongoose = require('mongoose')

const existedRelation = await this.model.aggregate([
   "$match":  "_id": mongoose.Types.ObjectId(firstId)  ,
   "$project": 
    "relations": 
      "$filter": 
        "input": "$links",
        "as": "link",
        "cond": 
          "$and": [
             "$eq": ["$$link.target.entityId", `$objectIdValue`] ,
             "$eq": ["$$link.linkTypeId", linkTypeId] 
          ]
        
      
    
  
])

【讨论】:

好的,linkTypeId 也应该转换为 "$eq": ["$$link.linkTypeId", mongoose.Types.ObjectId(linkTypeId)]

以上是关于使用_id查找不适用于聚合[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB聚合查找和展开[重复]

Mongoose find() 不适用于 $not 查询 [重复]

如何将此mongoDb聚合用于C#[重复]

猫鼬聚合反向查找或没有localField的查找[重复]

在猫鼬中填充+聚合[重复]

Python模块适用于2.7但不适用于3.5 [重复]