打印 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); });
}
未经测试:注意错别字!
我有一个格式的文档:
{_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); });
}
未经测试:注意错别字!