打印mongo文档内键的值

时间:2015-05-08 06:25:41

标签: mongodb mongodb-query

我有一份格式为

的文件
{_id:ObjectId("541...009b"), name:"abc" data:{"F_001":123abc, "priority":"urgent", ...},... }

想要编写一个通用函数来更新密钥{data.F_001:0},否则所有数据都会保持不变:

updateExistingKey("user", {name:"abc"}, "data.F_001");

由于我无法实现这一目标,我试图打印价值,但没有取得任何成功:

function updateExistingKey(collection, query, keyname){
    db[collection].find(query).forEach(function(document) {
        print(document._id)        // prints ObjectId("541...009b")
        print(keyname)             // prints "data.F_001"
        print(document.data.F_001) // prints 123abc But
        print(document[keyname]);  // prints undefined rather than 123abc, why??
    });
}

2 个答案:

答案 0 :(得分:2)

   print(document.data.F_001) // prints 123abc But
   print(document[keyname]);  // prints undefined rather than 123abc, why??
                                                                      ^^^

嵌入式文档真正嵌入(即:嵌套)。它不是不是平面数据结构,其中的字段中包含点。因此,dot notation可能被视为路径,允许您访问嵌套对象中嵌入的字段。简单地说,两者都是等价的:

document.data.F_001
document["data"]["F_001"]

但是和

不一样
document["data.F_001"]

如果你想通过其键名更新一个任意字段,你的函数原型很好地匹配MongoDB update函数(除了值缺少。我在这里假设它是硬编码的)。所以你需要一个简单的包装器。 喜欢的东西:

function updateExistingKey(collection, query, keyname){
    updt = {};
    updt[keyname] = "SomeNewValue";

    db[collection].update(query,
                          {$set: updt},
                          {multi: true});
}

未经测试:谨防拼写错误!

如果您想检索一个任意字段,您可以使用聚合框架的$project运算符将您的任意字段名称映射到输出文档中的某个已知字段:

function printExistingKey(collection, query, keyname){
    // XXX probably need some "keyname" validation here
    // ...

    db[collection].aggregate([
                      {$match: query },
                      {$project: { datafield: "$" + keyname }}
    ]).forEach(function(d) { print(d._id); print(d.datafield); });
}

未经测试:谨防拼写错误!

答案 1 :(得分:0)

尝试这样,它会起作用

function updateExistingKey(collection, query, keyname){
    db[collection].find(query).forEach(function(document) {
       print(document + "." + keyname);  
    });
}

http://docs.mongodb.org/manual/reference/method/cursor.forEach/