Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongodb点域更新_Javascript_Mongodb_Mongodb Query - Fatal编程技术网

Javascript Mongodb点域更新

Javascript Mongodb点域更新,javascript,mongodb,mongodb-query,Javascript,Mongodb,Mongodb Query,我在Mongo中有以下模式: var OrderSchema = new Schema({ postcode: String, ... status: { last_check: { type: Date }, date: Date, code: String, postnum: String, text: String, class: String }, }); 我

我在Mongo中有以下模式:

var OrderSchema = new Schema({
    postcode: String,
    ...
    status: {
        last_check: { type: Date },
        date: Date,
        code: String,
        postnum: String,
        text: String,
        class: String
    },
});
我有一个保存数据的功能,旧方法是注释:

function save_order(data) {
//    var order = new Order(data);
//    var upsertData = order.toObject();
//    delete upsertData._id;
//    Order.findOneAndUpdate({postcode: order.postcode}, upsertData, {upsert: true}, function (err) {
  Order.update({postcode: data.postcode}, {$set:data}, function (err) {
    if (err) console.log('err');
  });
}
此处是传递给函数的数据示例:

{ postcode: 'BV123456789BY',
  status: 
   { last_check: 1413539153572,
     code: '06',
     postnum: '247431',
     date: Thu Oct 16 2014 09:52:00 GMT+0300 (Восточная Европа (лето)),
     text: '06. Поступило в участок обработки почты (247431) Светлогорск - 1' } }
用于设置状态的函数。类工作正常-它不会覆盖状态:

function setByOrderId(id, data) {
//   data = {'status.class': 'danger'}
    Order.update({_id: id}, {$set: data}, function (err) {
        if (err) console.log('err');
    });
}
问题是当我更新状态时,status.class的值消失了。。。
如何在不覆盖status.code的情况下更新状态?谢谢。

当然可以,因为这正是您要求它做的。尽管有你的头衔,这里没有任何用处。如果您不想覆盖现有属性,当然要这样做。现在,您只是替换整个对象,尽管您使用where,除非您在这里更改结构,否则基本上是多余的

要解决这个问题,首先需要操作数据对象。按照这些思路:

var newobj = {};
Object.keys( data ).forEach(function(key) {
    if ( typeof(data[key]) == "object" ) {
       Object.keys( data[key] ).forEach(function(subkey) {
           newobj[key + "." + subkey] = data[key][subkey];
       });
    } else {
       newobj[key] = data[key];
    }
});
这将在newobj结构中提供以下内容和输出:

{
    "postcode" : "BV123456789BY",
    "status.last_check" : 1413539153572,
    "status.code" : "06",
    "status.postnum" : "247431",
    "status.date" : ISODate("2014-10-17T11:28:20.540Z"),
    "status.text" : "06. Поступило в участок обработки почты (247431) Светлогорск - 1"
}
当然,您可以继续进行常规更新,并确保一切正常:

Order.update({ "postcode": newobj.postcode}, { "$set": newobj }, function (err) {
    if (err) console.log(err);
});

当然,对于一个更嵌套的结构,您需要一些递归,但这应该给您一个大致的想法。点符号是一种方法,但你需要实际使用它。

当然可以,因为这正是你要求它做的。尽管有你的头衔,这里没有任何用处。如果您不想覆盖现有属性,当然要这样做。现在,您只是替换整个对象,尽管您使用where,除非您在这里更改结构,否则基本上是多余的

要解决这个问题,首先需要操作数据对象。按照这些思路:

var newobj = {};
Object.keys( data ).forEach(function(key) {
    if ( typeof(data[key]) == "object" ) {
       Object.keys( data[key] ).forEach(function(subkey) {
           newobj[key + "." + subkey] = data[key][subkey];
       });
    } else {
       newobj[key] = data[key];
    }
});
这将在newobj结构中提供以下内容和输出:

{
    "postcode" : "BV123456789BY",
    "status.last_check" : 1413539153572,
    "status.code" : "06",
    "status.postnum" : "247431",
    "status.date" : ISODate("2014-10-17T11:28:20.540Z"),
    "status.text" : "06. Поступило в участок обработки почты (247431) Светлогорск - 1"
}
当然,您可以继续进行常规更新,并确保一切正常:

Order.update({ "postcode": newobj.postcode}, { "$set": newobj }, function (err) {
    if (err) console.log(err);
});
当然,对于一个更嵌套的结构,您需要一些递归,但这应该给您一个大致的想法。点符号是一种方法,但你需要实际使用它