Обновление массива с $ не работает в mongodb-native nodejs
Мой mongodb похож на следующее
{ "_id" : ObjectId("4de20ef97065cc77c80541fd"),
"todo" : [
{
"id" : 1,
"desc" : "hi",
"done" : 0
},
{
"id" : 2,
"desc" : "hello",
"done" : 0
}
], "user" : "saturngod" }
Итак, я обновляю данные вот так.
db.tasks.update({user:'saturngod','todo.id':2},{"$set":{"todo.$.done":1}});
он отлично работает в mongodb cli, но не может работать в вашем нод-mongodb-native-драйвере.
Я написал такой код
task_collection.update({user:username,'todo.id':taskId}, {"$set":{"todo.$.done":1}},{safe:true},function(error, result){
sys.puts("callback user:"+username+"id:"+taskId+"error:"+error);
if( error ) callback(error,result);
else callback(null,result)
});
ошибка возвращает нулевое значение и обратный вызов также работает. Однако данные не были обновлены в базе данных.
Обновлено: я нашел 'todo.id': taskId не может найти ни одной строки. Он работает в mongo cli, но не работает в mongodb-native nodejs
полный источник по адресу: https://github.com/saturngod/tatoo/blob/master/data-provider.js
2 ответа
Решение
Исправлено, проблема в том, что идентификатор задачи не является номером.
task_collection.update({user:username,'todo.id':Math.floor(taskId)}, {"$set":{"todo.$.done":1}},{safe:true},function(error, result){
Это потому, что у тебя есть некоторые опечатки. Смотрите комментарии:
// Should be username, not user, based on the query that worked
task_collection.update({user:user,'todo.id':taskId}, {"$set":{"todo.$.done":1}},{safe:true},function(err, result){
sys.puts("callback user:"+user+"id:"+taskId+"error:"+error);
// error is null because your callback argument name is err, not error
if( error ) callback(error,result);
else callback(null,result)
});