猫鼬填充两个简单的模式

Posted

技术标签:

【中文标题】猫鼬填充两个简单的模式【英文标题】:mongoose populate two simple schemas 【发布时间】:2018-12-15 10:52:34 【问题描述】:

我坚持使用猫鼬populate() 方法。

这是我的架构:

const GroupSchema = Schema(
  title: String,
  ips: [
    
    ip: String,
    hostname: String,
    added :  type : Date, default: Date.now 
    
  ]
);

module.exports = mongoose.model('groups', GroupSchema);

const UserSchema = Schema(
  username: String,
  ip: String,
  groups: [
    
     _id :  type: Schema.Types.ObjectId, ref: 'groups',
     added :  type : Date, default: Date.now 
    
  ]
);

module.exports = mongoose.model('users', UserSchema);

我正在尝试通过groups._id 加入users.groups[]._id,但绝对没有运气。

这是我的尝试:

  User.find().
    populate('groups').
    exec(function (err, user) 
    if (err) return handleError(err);    
      console.log(user);
  );

得到这个结果:

  _id: 5b3e039a2f714d38ccf66cax,
    username: 'rrrr',
    ip: '10.1.1.1',
    groups: [ [Object], [Object] ],
    __v: 0  ]

我想变成这样:

  _id: 5b3e039a2f714d38ccf66cax,
    username: 'rrrr',
    ip: '10.1.1.1',
    groups: [ title: sssss, added: ssss , title: xxxx, added: ssss] ],
    __v: 0  ]

【问题讨论】:

您正在获取groups: [ [Object], [Object] ] 中的数据...尝试使用user[0].groupsuser[0].groups[0] 进行控制台 不工作。我得到了这个: GET /users 304 10.850 ms - - 添加:2018-07-07T16:14:41.689Z,_id: 5b3de77deea8fa128428421d 从您的控制台 _id: 5b3e039a2f714d38ccf66cax, username: 'rrrr', ip: '10.1.1.1', groups: [ [Object], [Object] ], __v: 0 ] 看来您正在获取组...有什么问题? 例如 user[0] 有两个组但未填充:User.find()。填充(“组”)。 exec(function (err, user) if (err) return handleError(err); console.log(user[0].username); console.log(user[0].groups[0].hostname); 控制台。日志(用户[0].组[1].主机名););我得到'未定义' 好的,谢谢,我会尝试找出如何使用查找 【参考方案1】:

你可以尝试使用$lookup聚合

如果您使用的是 3.4 及以下版本的 mongodb

User.aggregate([
   "$unwind": "$groups" ,
   "$lookup": 
    "from": Groups.collection.name,
    "let":  "groupId": "$groups._id" ,
    "pipeline": [
       "$match":  "$expr":  "$eq": [ "$_id", "$$groupId" ]   
    ],
    "as": "groups._id"
  ,
   "$unwind": "$groups._id" ,
   "$group": 
    "_id": "$_id",
    "username":  "$first": "$username" ,
    "ip":  "$first": "$ip" ,
    "groups":  "$push": "$groups" 
  
])

如果您使用的是 3.6 及以上版本的 mongodb

User.aggregate([
   "$unwind": "$groups" ,
   "$lookup": 
    "from": Groups.collection.name,
    "localField": "groups._id",
    "foreignField": "_id",
    "as": "groups._id"
  ,
   "$unwind": "$groups._id" ,
   "$group": 
    "_id": "$_id",
    "username":  "$first": "$username" ,
    "ip":  "$first": "$ip" ,
    "groups":  "$push": "$groups" 
  
])

【讨论】:

以上是关于猫鼬填充两个简单的模式的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬没有加入两个系列

如何在猫鼬和节点js中的同一记录上填充两个集合

EJS:如何在 EJS 文件中呈现来自猫鼬的两个或多个填充集合

虚拟填充猫鼬

有没有办法设置猫鼬来检查两个值是不是在一个模式中匹配?

猫鼬填充没有模型的嵌套模式