我的数据库中有以下文档:
{
"_id": ObjectId("ABCDEFG12345"),
"options" : {
"foo": "bar",
"another": "something"
},
"date" : {
"created": 1234567890,
"updated": 0
}
}
我希望使用点表示法同时更新options.foo
和date.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
子文档不保留其预先存在的数据?
答案 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参数是一个数组,所以我像数组一样导航
注意:[连接我使用模板文字的字符串](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)
一切正常......