如何填充非相关字段mongoose

时间:2015-06-15 11:56:57

标签: node.js mongodb 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"}]
}

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

1 个答案:

答案 0 :(得分:0)

Mongoose .populate()以及您可能找到的其他方法并非#34;加入魔法"对于MongoDB。他们实际上所有做的是执行"额外"查询数据库上的操作和"合并"结果"引擎盖"对你而言,而不是你自己做的工作。

所以,只要你可以处理它,你最好的选择是使用"嵌入"这保持了相关的"您所关注的文件中的信息"配对"它,例如" Roles":

{
    "_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){        //填充"加入"结果在这里    })

这背后的效果是有效的(基本的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();
   })
})

Mongoose致力于使用" schema"定义为"知道"哪个集合执行"其他查询"然后返回"加入"结果给你。但是单个查询,但多次点击数据库。

其他方案可能"保持"文档本身中引用的集合信息,而不是依赖于"模型代码"获取这些信息。但同样的原则适用于需要再次调用数据库并执行某种类型的" merge"在提供的API中。

所以这一切都归结为你的选择。无论你是"嵌入"数据并以该成本为生,或者您参考"数据并与网络共存"成本"与多个数据库命中相关联。

这里的关键点是"没有什么是免费的,而且甚至不是SQL RDBMS执行的方式"加入"还有一个"成本"它拥有的NoSQL解决方案就像MongoDB这样做的原因很多,而且#34;不支持连接"以本地方式购买"成本"参与分布式数据系统。

这里的主要教训是“做什么适合你和你的应用程序"”,而不仅仅是选择现在最酷的东西",但基本上期望你从选择不同的东西存储方案。他们都有自己的目的。正如俗话说的那样,马术课程。