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

Adding a subfield name dynamically depending on variables passed

本文关键字:添加 字段 动态 变量      更新时间:2023-09-26

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

我的数据应该如何看起来是这样的。注意这个树: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);

由于语句的更新对象已经使用变量设置了键名。