javascript - 根据传递的变量动态添加子字段名称

标签 javascript node.js mongodb

我正在尝试向日志字段添加一个字段,该字段将动态获得其名称。例如,如果我想推送关于“名称”字段的更新,我希望能够在运行时决定它应该这样命名。我将尽力在下面解释。

我的数据应该是这样的。注意树: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/

相关文章:

javascript - es6类。 this.addeventlistener

javascript - Jquery div slider

mongodb - 如果将 bson ObjectId 传递给 golang 中的 GridFS OpenId(),我会收到错误 "not found"

javascript - MongoDB 事务有很多 WriteConflict 错误

javascript - 需要禁用内联 Fancybox 画廊的循环 - 循环 : false and cyclic: false not working

javascript - 效率、隐藏的 HTML 或 JavaScript DOM 附加?

node.js - NodeJS - 响应流

javascript - 我可以在 Node.js/Express 中动态导入 TypeScript 模块吗?

javascript - crypto.pbkdf2 是异步的,如何将其视为同步?

mongodb - 无法获取allowDiskUse :True to work with pymongo