Mongoose 聚合查找 - 如何按特定 id 过滤

Posted

技术标签:

【中文标题】Mongoose 聚合查找 - 如何按特定 id 过滤【英文标题】:Mongoose aggregate Lookup - How to filter by specific id 【发布时间】:2019-06-10 11:03:56 【问题描述】:

我正在尝试创建一个聚合管道 - $lookup 从另一个接收 只收集不等于特定_id的项目

例如:

诊所集合:

_id:1,name:'some name1'
_id:2,name:'some name2'
_id:3,name:'some name3'

业务集合:

_id:1,name:"some business name",clinics:[1,2,3]

我的聚合管道查询:

db.business.aggregate([
    $match: _id: mongoose.Types.ObjectId(businessId),
    $lookup: 
    from: "ClinicsCollection", localField: "clinics", foreignField: "_id", as: "clinics",

]

我想过滤所有不等于特定 ID 号的诊所,比如说 _id : 1

预期结果:

 clinics :[
    _id:2,name:'some name2'
    _id:3,name:'some name3'
 ]

我怎样才能做到这一点?

谢谢

【问题讨论】:

【参考方案1】:

你可以在aggregation以下使用mongodb 3.6及以上

您只需将$match 与子集合一起使用,就像在第一阶段对父集合使用一样。

db.BusinessCollection.aggregate([
   "$match":  "clinics":  "$type": "array" ,
   "$lookup": 
    "from": "ClinicsCollection",
    "let":  "clinics": "$clinics" ,
    "pipeline": [
       "$match": 
        "$expr": 
          "$and": [
             "$in": ["$_id", "$$clinics"] ,
             "$not":  "$eq": ["$_id", 1] 
          ]
        
      
    ],
    "as": "clinics"
  
])

【讨论】:

err : MongoError : $in 需要一个数组作为第二个参数,发现:缺少 哦,在我的数据库中,它是业务中的clinicsIds .. 抱歉,我如何才能从查找中仅获取特定字段?谢谢 这里为什么需要一个让?【参考方案2】:

您可以尝试以下聚合 3.6 以下的 mongodb 版本

db.business.aggregate([
    $match : _id : 1,
    $lookup : from : "clinics", localField : "clinics", foreignField : "_id", as : "clinics",
    $addFields : clinics : $filter : input : "$clinics", as : "c", cond : $ne : ["$$c._id", 1]
]).pretty()

结果

 "_id" : 1, "name" : "some business name", "clinics" : [  "_id" : 2, "name" : "some name2" ,  "_id" : 3, "name" : "some name3"  ] 

【讨论】:

以上是关于Mongoose 聚合查找 - 如何按特定 id 过滤的主要内容,如果未能解决你的问题,请参考以下文章

如何获取文档 MangoDB&Mongoose 上的特定字段并聚合一些字段?

Mongoose 按标签聚合分组项目

使用 MongoDB/Mongoose 按 ID 查找提交

Mongoose - 如何聚合两个集合中的内容

如何在 Mongoose NodeJS 中使用聚合从数组中检索特定元素

Mongoose,查找,返回特定属性