将_id引用字段作为文档投影

时间:2015-06-07 12:04:53

标签: mongodb nosql

考虑当前的集合:

# 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字段中,因为将来更新会很复杂

非常感谢。

1 个答案:

答案 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"
    }
}
相关问题