我有一份格式为
的文件{_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??
});
}
答案 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/