【问题标题】:How do you populate a field from a sibling collection using Mongoose?如何使用 Mongoose 从兄弟集合中填充字段?
【发布时间】:2017-08-23 11:43:16
【问题描述】:

我想在 Mongoose 中使用populate 方法来查询一个集合。这是我的架构:

var UnitSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    unitNumber: Number,
    members: [MemberSchema],
    orgs: [OrgSchema]
});

var MemberSchema = new mongoose.Schema({
    name: {
        first: String,
        last: String
    },
    phone: String,
    email: String
});

var OrgSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    sortIndex: Number,
    roles: [RoleSchema]
});

var RoleSchema = new mongoose.Schema({
    name: String,
    sortIndex: Number,
    member: {
        type: Schema.Types.ObjectId,
        ref: 'Member'
    }
});

这是一个示例Unit 集合:

{
    "_id": "58da7bd6e7092e8735646ba0",
    "name": "Unit Name",
    "orgs": [
        {
            "name": "Org name",
            "sortIndex": 0,
            "_id": "58da7bd6e7092e8735646c2d",
            "roles": [
                {
                    "name": "Role Name",
                    "sortIndex": 0,
                    "member": "58dbd1e6c9a893a7840472ad"
                }
            ]
        }
     ],
     "members": [
         {
             "name": {
                 "first": "First Name",
                 "last": "Last Name"
             },
             "_id": "58dbd1e6c9a893a7840472ad"
         }
     ]
 }

如何将Member 文档填充到Roles 集合中的成员字段,这样我的输出将如下所示:

[
    {
        "name": "Org name",
        "sortIndex": 0,
        "_id": "58da7bd6e7092e8735646c2d",
        "roles": [
            {
                "name": "Role Name",
                "sortIndex": 0,
                "member": {
                    "name": {
                        "first": "First Name",
                        "last": "Last Name"
                     },
                     "_id": "58dbd1e6c9a893a7840472ad"
                }
             }
         ]
     }
 ]

这是我想到的查询:

Unit.findOne({unitNumber: unitNumber}).populate('roles.callings.member').exec(...)

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-populate


    【解决方案1】:

    给你!

    unit.findOne({unitNumber: 543})
    .populate('orgs')
    .exec(function(err, unitDoc){
        var subDoc = unitDoc.orgs;
        for(var org of subDoc){
            org.populate('roles', function(err, data){
                var rolesDoc = data.roles;
                for(var role of rolesDoc){
                    role.populate('member', function(err, rdata){
                        console.log(JSON.stringify(unitDoc));
                    })
                }
            })
        }
    })
    

    您需要像上面那样填充每个子文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 2019-09-17
      • 1970-01-01
      • 2012-01-22
      • 2012-09-11
      • 2019-01-14
      • 2017-05-21
      • 2017-09-17
      相关资源
      最近更新 更多