考虑当前的集合:
# the manager
db.employees.insert({_id: ObjectId(
"4d85c7039ab0fd70a117d730"),
name: 'Leto'})
# the yours employees
db.employees.insert({_id: ObjectId(
"4d85c7039ab0fd70a117d731"),
name: 'Duncan',
manager: ObjectId(
"4d85c7039ab0fd70a117d730")});
db.employees.insert({_id: ObjectId(
"4d85c7039ab0fd70a117d732"),
name: 'Moneo',
manager: ObjectId(
"4d85c7039ab0fd70a117d730")});
使用此模型,是否可以使用文字employees
文档的manager
字段恢复Leto
?像
{ "_id" : ObjectId("4d85c7039ab0fd70a117d730"), "name" : "Leto" }
{ "_id" : ObjectId("4d85c7039ab0fd70a117d731"), "name" : "Duncan", "manager" : { "_id" : ObjectId("4d85c7039ab0fd70a117d730"), "name" : "Leto" } }
{ "_id" : ObjectId("4d85c7039ab0fd70a117d732"), "name" : "Moneo", "manager" : { "_id" : ObjectId("4d85c7039ab0fd70a117d730"), "name" : "Leto" } }
而不是
{ "_id" : ObjectId("4d85c7039ab0fd70a117d730"), "name" : "Leto" }
{ "_id" : ObjectId("4d85c7039ab0fd70a117d731"), "name" : "Duncan", "manager" : ObjectId("4d85c7039ab0fd70a117d730") }
{ "_id" : ObjectId("4d85c7039ab0fd70a117d732"), "name" : "Moneo", "manager" : ObjectId("4d85c7039ab0fd70a117d730") }
如果没有,我怎么做?因为我很担心将经理放在manager
字段中,因为将来更新会很复杂
非常感谢。
答案 0 :(得分:0)
尝试使用 forEach()
游标的 find()
方法迭代具有经理密钥的文档(通过 { {3}} 运算符和 $exists
运算符,以检查它是否为 ObjectId
),并在每个循环中查询集合对于包含 $type
的经理文档,并将其指定为manager
属性的子文档:
db.employees.find({"manager": {"$exists": true, "$type": 7}}).forEach(function (e){
var manager = db.employees.findOne({"_id": e.manager});
e.manager = manager;
db.employees.save(e);
});
db.employees.find();
<强>结果强>:
/* 0 */
{
"_id" : ObjectId("4d85c7039ab0fd70a117d730"),
"name" : "Leto"
}
/* 1 */
{
"_id" : ObjectId("4d85c7039ab0fd70a117d731"),
"name" : "Duncan",
"manager" : {
"_id" : ObjectId("4d85c7039ab0fd70a117d730"),
"name" : "Leto"
}
}
/* 2 */
{
"_id" : ObjectId("4d85c7039ab0fd70a117d732"),
"name" : "Moneo",
"manager" : {
"_id" : ObjectId("4d85c7039ab0fd70a117d730"),
"name" : "Leto"
}
}