【问题标题】:how to create dynamic document keys in mongodb如何在 mongodb 中创建动态文档键
【发布时间】:2016-12-03 19:17:07
【问题描述】:

我的问题包括创建一个包含动态字段和未定义名称的集合,这些名称应由用户输入。所以我尝试使用变量来做,但它不起作用。

这是代码

insertData_dynamic_colone : function(collection) {        
    var colone1 = "prod";
    var colone2 = "prod2";
    dbObject.collection(collection).insertOne({
        colone1 : "14",
        colone2 : "15"
    }, function(err, result) {
        assert.equal(err, null);         
    });
}, 

所以在我得到的数据库上

> db.colone_dynamic.find()
{ "_id" : ObjectId("579af3c4f41e03f0362a5170"), "colone1" : "14", "colone2" : "15" }

但我希望得到

> db.colone_dynamic.find()
    { "_id" : ObjectId("579af3c4f41e03f0362a5170"), "prod" : "14", "prod2" : "15" }

【问题讨论】:

  • 如果你使用的是无模式方法,那么你可以直接给字段名起任何名字

标签: javascript json node.js mongodb


【解决方案1】:

您要插入动态形成的文档。不是真正的动态索引正确。您可以使用以下内容来实现您想要的。

insertData_dynamic_colone : function(collection) {
    var colone1 = "prod";
    var colone2 = "prod2";
    var insertObj = {};
    insertObj[colone1] = "14";
    insertObj[colone2] = "15";
    dbObject.collection(collection).insertOne(insertObj, function(err, result) {
        assert.equal(err, null);         
    });
}, 

【讨论】:

    【解决方案2】:

    使用bracket notation 动态构建文档。您需要先创建一个空对象来保存键,然后使用括号表示法将动态字段添加到对象:

    insertData_dynamic_colone: function(collection, colone1, colone2) {
        var obj = {};
        obj[colone1] = "14";
        obj[colone2] = "15";
        dbObject.collection(collection).insertOne(obj, function(err, result) {
            assert.equal(err, null);         
        });
    }
    

    insertData_dynamic_colone: function(collection) {
    
        var obj = {},
            colone1 = "prod",
            colone2 = "prod2";
        obj[colone1] = "14"; // bracket notation
        obj[colone2] = "15";
    
        dbObject.collection(collection).insertOne(obj, function(err, result) {
            assert.equal(err, null);         
        });
    }
    

    或者,您可以使用 ES2015 Object initializer 语法(正如 cmets 中的 @xmikex83 所指出的那样):

    insertData_dynamic_colone: function(collection) {
    
        var colone1 = "prod";
        var colone2 = "prod2";
        dbObject.collection(collection).insertOne({
            [colone1] : "14", // Computed property names (ES6)
            [colone2] : "15"
        }, function(err, result) {
            assert.equal(err, null);         
        });
    }
    

    【讨论】:

    【解决方案3】:

    试试:

    insertData_dynamic_colone: function(collection) {
      var data = {
        colone1: "prod",
        colone2: "prod2"
      };
      dbObject.collection(collection).insertOne(data, function(err, result) {
        assert.equal(err, null);
      });
    },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      相关资源
      最近更新 更多