【问题标题】:Why should I create a json to save a document from Mongoose + MongoDB + Node.JS?为什么我应该创建一个 json 来保存来自 Mongoose + MongoDB + Node.JS 的文档?
【发布时间】:2012-12-31 16:37:24
【问题描述】:

考虑一下,Mongoose 架构:

var schema_obj = new Schema({
    field1: String,
    field2: String, .........
});

JSON 文档,如:

var json_obj = {
field1: 'value', 
field2 : 'val2', 
............
};

为了保存我调用方法,比如

var Model_obj = mongoose.model('model_name', schema_object);
var document_obj = new Model_obj(json_obj);
document_obj.save(function(err,data){/*some logic after save*/});

现在我的问题是:我为什么要创建一个 json_obj。 当我手中已经有一个模式对象时,它已经具有所有字段(field1,field2)。如果我只想为这些字段提供值,为什么我应该通过再次写入所有字段名称来创建 json?

如果我有 n 个字段,这将成为再次写入所有字段的开销。有什么办法可以避免这种开销?

类似于我从定义的 mongoose 架构中得到一个空的 JSON 对象,然后只分配值?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您在寻找什么样的 API?您可以在模型实例和save 上设置属性。但我不确定我是否明白为什么

    var thing = new Thing();
    thing.name = "The Name";
    thing.priceInCents = 1999;
    thing.numAvailable = 10;
    thing.save();
    

    容易
    var thing = new Thing({name: 'The name', priceInCents: 1999, numAvailable: 10});
    thing.save();
    

    在网络应用程序中,这类似于

    app.post('/things', function(req, res) {
      var thing = new Thing(req.body.thing);
      thing.save(function() { ... });
    });
    

    【讨论】:

    • 我们不能在模型对象上设置任何属性,但我们可以在文档对象上设置。代码就在这里..感谢您的帮助..
    • 我不肯定你最后的陈述是什么意思,但我要this example in Mongoose's readme。 (其实是Model inherits from Document。)
    • 我的意思是事物(大写 T)是模型对象。可能我对mongoosejs.com/docs/index.html 中的这句话感到困惑“每个文档都将是一只小猫,具有我们架构中声明的属性和行为。”.. 无论如何感谢您的快速支持..
    【解决方案2】:

    以下是我目前找到的最佳解决方案

    var sch_obj = new mongoose.Schema({
     "_id ": String,
     "field1": String,
     "field2": String
    }, { collection: 'collection_name'});
    
    var Mod_obj = mongoose.model('collection_name', sch_obj);
    
    var json_obj = new Mod_obj({
    "_id ": 'Strin', /*This is the only field which cannot be assigned later*/
    }); 
    
    //json_obj._id = 'some value'; /*THIS CANNOT BE DONE*/
    json_obj.field1 = 'value1';
    json_obj.field2 = 'value2';
    json_obj.save(function (err, data) { console.log(data); });
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 ES6,扩展运算符可能会派上用场。考虑到你已经定义了你的猫鼬模型并且你正在从 req.body 获取你的字段值。您可以像这样简单地为该模型创建一个新对象:

      const Thing = mongoose.model('collection_name', sch_obj); 
      const json_obj = new Thing({ ...req.body });
      json_obj.save()
      .then(savedThing => {
          //DO things with your saved object.
      })
      .catch(error => {
         //Handle error in saving the object
      })
      

      【讨论】:

        猜你喜欢
        • 2018-06-16
        • 1970-01-01
        • 2023-04-02
        • 2015-02-16
        • 1970-01-01
        • 2021-05-15
        • 2016-05-07
        • 1970-01-01
        • 2021-09-09
        相关资源
        最近更新 更多