Mongodb 打印mongo文档内键的值

Mongodb 打印mongo文档内键的值,mongodb,mongodb-query,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 updateEx

我有一份格式如下的文件:

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

嵌入的文档实际上是嵌入的(即:嵌套的)。它不是一个带有点的字段的平面数据结构。因此,可以将路径视为允许您访问嵌套对象中嵌入的字段的路径。简单地说,两者是等价的:

document.data.F_001
document["data"]["F_001"]
但这与

document["data.F_001"]

如果您想通过其键名更新一个任意字段,那么您的函数原型与MongoDB函数非常匹配(值得注意的例外是缺少该值。我假设它是硬编码的)。因此,您只需要一个简单的包装器。诸如此类:

未经测试:小心打字错误


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

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

未经测试:小心打字错误

那是什么[关键字名称]contains@SatishShinde-“data.F_001”,参见参数updateExistingKey(“user”,{name:“abc”},“data.F_001”);我读到:“[…]编写一个通用函数来更新data.userid”,但是:“我无法打印文档密钥”这里真正需要的是什么?更新文档?或者打印某个任意键的值?@SylvainLeroux-最终需要更新该键。我无法更新它,所以尝试打印它。@trex这就是我认为的原因;)请注意,在回答您的问题时,我注意到您将要更新的字段的键名作为参数传递,而不是值?它是硬编码的吗?不,它不工作。它像这样打印
[object object].data.F_001
function updateExistingKey(collection, query, keyname){
    updt = {};
    updt[keyname] = "SomeNewValue";

    db[collection].update(query,
                          {$set: updt},
                          {multi: true});
}
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); });
}