两个集合的聚合数组 mongodb

Posted

技术标签:

【中文标题】两个集合的聚合数组 mongodb【英文标题】:aggregate array of two collections mongodb 【发布时间】:2020-06-13 01:44:12 【问题描述】:

我有两个系列:ClinicasMedicosClinicas 可以有很多 Medicos。这种关系是这样建立的:

medico: [
    medicoId: 
      type: mongoose.Schema.Types.ObjectId,
      ref: 'medicos'
    
  ],

我将有以下 json 结构:

[
    
        "nome": "clinica teste",
        "medico": [
            
                "_id": "5e011a3796a5f80e3c0c8d20",
                "medicoId": 
                    "_id": "5dc5eef455a8f61698a0f2cd",
                    "nome": "Hancho Crutis",
                
            ,
            
                "_id": "5e011a3796a5f80e3c0c8d1f",
                "medicoId": 
                    "_id": "5df16e5746783116709f09b7",
                    "nome": "camilinha",
                
            
        ],
    
]

我想要的是对这些数据进行“连接”。经过长时间的研究,我得到了这个代码,但响应总是空的。有人可以告诉我我做错了什么吗?

Clinicas.aggregate([
         $unwind: "$medico",   

         $lookup: 
            from: "medicos",
            localField: "medicoId._id",
            foreignField: "_id",
            as: 'nome'
        ,

         $match: "medicoId._id": "5df16e5746783116709f09b7",       

    ])

【问题讨论】:

如果你在最后省略了$match 阶段,它会返回任何东西吗? 返回所有记录 听起来好像有一个文档与该 medicoId._id 作为字符串匹配。文档中的该字段是否包含 ObjectId? 是的,它确实包含一个 ObjectId @augustofrancisco : 由于您在 medico 上设置了 $unwind,因此您的 localField 将是 localField: "medico.medicoId._id",您需要首先检查 nomelookup 阶段返回的内容 【参考方案1】:

需要在ObjectId中进行转换,

var mongoose = require('mongoose');

Clinicas.aggregate([
     $unwind: "$medico" ,

    
        $lookup: 
            from: "medicos",
            localField: "medicoId._id",
            foreignField: "_id",
            as: 'nome'
        
    ,

     $match:  "medicoId._id": mongoose.Types.ObjectId('5df16e5746783116709f09b7')  ,

])

【讨论】:

以上是关于两个集合的聚合数组 mongodb的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB聚合在根中创建内部数组

MongoDBMongoDB的一些操作命令

MongoDB 聚合 - 满足所有对象数组而不是至少一个的查询集合

数组聚合/集合 - 需要明确指定结构字段?

如何聚合 ObjectId 对数组及其相关集合

如何使用带有_id数组的动态集合的聚合来获取数据