javascript - Mongodb点字段更新

标签 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
    },
});

我有一个保存数据的函数(旧方法已注释):

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' } }

设置 status.class 的函数工作正常 - 它不会覆盖状态:

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?谢谢。

最佳答案

当然可以,因为这正是您要求它做的事情。尽管有你的标题,但这里根本没有使用 "dot notation" 。如果您不打算覆盖现有属性,这当然是您想要做的。现在你只是替换整个对象,尽管你使用了$set,除非你改变这里的结构基本上是多余的。

要“修复”此问题,您需要首先操作您的 data 对象。大致如下:

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);
});

当然,您需要一些递归来实现更嵌套的结构,但这应该会给您一个总体思路。点表示法是可行的方法,但您需要实际使用它。

关于javascript - Mongodb点字段更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26422929/

相关文章:

mongodb - 将数据集投影到新对象中

mongodb自定义比较到filter

javascript - 本地存储与 AngularJS $cacheFactory

c# - 在 JavaScript 中引用 C# 变量

performance - mongodb:分片可以提高查询性能吗?

java - 尝试通过 java 驱动程序连接时,SSLHandshake 在 mongodb 服务器上失败

mongodb - 我可以在 findOneAndUpdate 的投影中访问位置 $ 运算符吗

javascript - 在同一个 MVC 项目中的 C# 类和 JS 文件中使用相同的静态数据,而无需在运行时一次又一次地重建

javascript - 此正则表达式方言不支持条件

mongodb - 如何: $merge and On-Demand-Materialized views