在猫鼬中反向填充

Posted

技术标签:

【中文标题】在猫鼬中反向填充【英文标题】:Reverse populate in mongoose 【发布时间】:2019-05-03 09:11:37 【问题描述】:

如何在 mongo 中反向填充。我有 2 个架构的

用户:

var user_scheme = new mongoose.Schema(
  name:String,
  age:Number,
  roles:
    type:mongoose.Schema.Types.ObjectId,
    ref:'Role'
  
 );

角色:

var role_scheme = new mongoose.Schema(
  name:String,
);

文件:

///user

"_id" : ObjectId("5bf9a19b01ce3e19b440aed8"),
"name" : "user1",
"age" : 22,
"roles" : ObjectId("5c0242621ab7b677e6b2e01e"),
"__v" : 0

 ///role

"_id" : ObjectId("5c0242621ab7b677e6b2e01e"),
"name" : "Admin"

代码:

User.find().populate('roles').exec(function (err, data) 
 res.json(data);
)

这里我可以获取用户下的角色,但是我如何获取每个角色下的用户。

【问题讨论】:

请张贴样本合集 问题已更新... 也发布来自roles 集合的文档。你想用哪个role 找到用户? 现在我如何在管理员角色中获取 user1,例如 - Role.find().populate('users') 类似的东西.. 你试过答案了吗? 【参考方案1】:

@Ashh 的 $lookup 函数对我不起作用。

我使用了更新的版本:

$lookup: 
    from: 'users',
    localField: '_id',
    foreignField: 'organization',
    as: 'users'

【讨论】:

最好和最简单的答案,无需任何外部模块?。应该是批准的答案 @Ashh 的答案对您不起作用,因为它适用于数组。用户有 roles 字段!【参考方案2】:

你可以在下面使用$lookup聚合

Role.aggregate([
   "$match":  "name" : "Admin" ,
   "$lookup": 
    "from": "users",
    "let":  "roleId": "$_id" ,
    "pipeline": [
       "$match":  "$expr":  "$eq": ["$roles", "$$roleId"]   
    ],
    "as": "users"
  
])

【讨论】:

【参考方案3】:

您可以使用mongoose-reverse-populate 模块。

【讨论】:

以上是关于在猫鼬中反向填充的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中填充嵌套模型

如何在猫鼬中填充嵌套实体?

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

如何在猫鼬中填充模型

在猫鼬中填充数据无法正常工作?

如何在猫鼬中异步填充嵌套对象?