打印 mongo 文档内键的值

Print a value of a mongo documents inner key

我有一个格式的文档:

{_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??
    });
}

像这样尝试,它会起作用

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

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

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

嵌入的文档是真正嵌入的(即:嵌套的)。它 而不是 一个平面数据结构,其字段中有一个点。因此,dot notation 可能被视为 path 允许您访问嵌入在 nested 对象中的字段。简单来说,两者是等价的:

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

但是和

不一样
document["data.F_001"]

如果你想 更新 一个任意字段的键名,你的函数原型与 MongoDB update 函数非常匹配(具有显着的异常 value 丢失。我假设它是硬编码的)。所以你只需要一个简单的包装器。 喜欢的东西:

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); });
}

未经测试:注意错别字!