我正在尝试向日志字段添加一个字段,该字段将动态获得其名称。例如,如果我想推送关于“名称”字段的更新,我希望能够在运行时决定它应该这样命名。我将尽力在下面解释。
我的数据应该是这样的。注意树:logs.(dynamicName).{ts, prop, value}。 dynamicName 继承自 prop 值。
"logs": {
"Name": [
{
"ts": 1436952585736,
"prop": "Name",
"value": "Fredd"
},
{
"ts": 1436952600336,
"prop": "Name",
"value": "Fred"
}
],
"description": [
{
"ts": 1436952585736,
"prop": "description",
"value": "A normal bloke"
}
],
我在我的应用程序中收到的数据是这样的:
{
"prop": "description",
"value": "A normal bloke"
}
我被难住了。我只是想 $push 到一个具有动态名称的新数组,例如像这样:
var logName = "logs."+prop;
collection.update(
{_id: documentId},
{ $push:
{ logName:
{
"ts": Date.now(),
"prop": log.prop,
"value": log.value
}
}
}
但是当然这不能简单地是:Mongo(或者可能是 node.js 驱动程序)从字面上获取变量 logName。我真的很想保留这种数据格式,而不是仅仅拥有一个单一的日志数组。
最佳答案
在 JavaScript 中,您可以使用“方括号”[]
符号来在对象键的一部分中使用变量。
// Input things
var prop = "Name";
var payload = {
"prop": "description",
"value": "A normal bloke"
};
// Manipulation code
payload.ts = new Date();
var update = { "$push": {} };
update["$push"]["logs." + logName] = payload;
结果基本上是这样的:
{ "$push": { "logs.Name": { "prop": "description", "value": "A normal bloke" } } }
那么你只需要做:
collection.update({ "_id": documentId },update);
因为您的语句的更新对象是使用变量设置的键名构造的。
关于javascript - 根据传递的变量动态添加子字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31763230/