繁体   English   中英

如何填充不相关的字段猫鼬

[英]How to populate a non related field mongoose

文件角色=

{ "_id" = "12345",  
   Name = "Developer"
},

{ "_id" = "67890",  
   Name = "Manager"
}

凭证员工=

{ "_id" = "00000",
  "Name"= "Jack",
  "Roles"= [{_id:"12345"},{_id:"67890"}]
}

我想选择一个角色并列出所有具有相同角色的用户。

我想得到一些类似的东西。

{ "_id" = "12345",  
   Name = "Developer"
   Employees = [{"_id":"00000"}]
}

是否可以使用填充来实现这一目标?

Mongoose .populate()和您可能会发现的其他方法不是MongoDB的“加入魔术”。 他们其实都是要做的就是在数据库上执行“附加”查询(一个或多个)操作和“合并”结果“引擎盖下”为你而不是你做自己的工作。

因此,您最好的选择就是使用“嵌入”,将“相关”信息保留在您要与之“配对”的文档中,例如“角色”:

{
    "_id": "0000",
    "name": "Developer",
    "employees": [{ "_id": "12345", "name": "Jack" }]
}

这很简单,但是当然要自负费用,并且要适当地处理“嵌入”条目以及如何根据“更新”或“阅读”使用它。 这是一次“读取”操作,但是由于需要在多个位置和多个文档中更新嵌入的信息,因此“更新”的成本可能更高。

如果您可以“参考”“生活”及其产生的费用,那么您始终可以这样做:

var rolesSchema = Schema({
    "name": String,
    "emloyees": [{ "type": Schema.Types.ObjectId, "ref": "Employee" }]
});

var employeesSchema = Schema({
    "name": String,
    "roles": [{ "type": Schema.Types.ObjectId, "ref": "Role" }]
});

var Role = mongoose.model('Role',rolesSchema); var Employee = mongoose.model('Employee',employeeSchema);

Role.find({“ _id”:“ 12345”})。populate(“ employees”)。exec(function(err,docs){//在此处填充“ joined”结果})

这实际上是在幕后做的(基本的JavaScript表示形式,“充其量”):

var roles = db.role.find({ "_id": "12345" }).map(function(doc) {
   doc.employees = doc.employees.map(function(employee) {
       return db.employees.find({ "_id": { "$in": doc.employees } }).toArray();
   })
})

猫鼬的工作原理是使用“模式”定义“知道”哪个集合来执行“其他查询”,然后将“联接”结果返回给您。 但这不是单个查询,而是对数据库的多次命中。

其他方案可能会“保留”文档本身中引用的集合信息,而不是依赖于“模型代码”来获取该信息。 但是,如果需要再次调用数据库并在提供的API中执行某种类型的“合并”,则适用相同的原则。

因此,一切都取决于您的选择。 您要么“嵌入”数据并以该成本承受费用,要么“参考”数据并以与多个数据库命中关联的网络“成本”承受费用。

这里的关键点是“没有什么是免费的”,甚至不是SQL RDBMS执行“联接”的方式,这也有其自身的“成本”,这是为什么像MongoDB这样的NoSQL解决方案以这种方式做到这一点的很多原因,以及对于分布式数据系统中涉及的“成本”,以本机方式“不支持联接”。

这里的主要课程是“做适合您和您的应用程序的事情”,而不仅仅是选择“现在最酷的事情”,而是基本上期望您从选择不同的存储解决方案中得到什么。 他们都有自己的目的。 俗话说,马为课程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM