为什么mongo点符号替换整个子文档?

时间:2017-01-24 07:40:43

标签: mongodb syntax mongojs

我的数据库中有以下文档:

{
  "_id": ObjectId("ABCDEFG12345"),
  "options" : {
    "foo": "bar",
    "another": "something"
  },
  "date" : {
    "created": 1234567890,
    "updated": 0
  }
}

我希望使用点表示法同时更新options.foodate.updated,如下所示:

var mongojs = require('mongojs');

var optionName = 'foo';
var optionValue = 'baz';

var updates = {};
updates['options.' + optionName] = optionValue;
updates['date.updated'] = new Date().getTime();

db.myCollection.findAndModify({
    query : {
        _id : ObjectId('ABCDEFG12345')
    },
    update : {
        $set : updates
    },
    upsert : false,
    new : true
}, function(error, doc, result) {

    console.log(doc.options);
    console.log(doc.date);

});

这导致:

{
  foo : 'baz',
  another : 'something'
}
{
  updated : 1234567890
}

具体来说,即使我使用点表示法,我预先存在的date.created字段也会被破坏。

为什么这只是部分工作? options子文档保留其预先存在的数据(options.another),为什么date子文档不保留其预先存在的数据?

2 个答案:

答案 0 :(得分:2)

$set运算符中传递的对象的格式为{ "data" : { "updated" : 1234567890 } }而不是{ "data.updated" : 1234567890 }时,所描述的行为通常会发生,但我不熟悉JavaScript中的点,足以说明如果这可能是JS方面的原因。

此外,它无法解释为何data而不是options

如果您可以打印存储在变量updates中的对象并将其发送到update字段中的MongoDB,那么就可以告诉问题的哪一方(JS或MongoDB)。

答案 1 :(得分:1)

我将您的代码传递给测试环境并使用您正在使用的相同库。用于本地ObjectId查询的mongojs库就像这样的mongojs.ObjectId(" ####")Can look the official documentation

对于findAndModify函数中的回调函数,docs参数是一个数组,所以我像数组enter image description here一样导航

注意:[连接我使用模板文字的字符串](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

一切正常......