Обновление массива с $ не работает в 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)
});
Другие вопросы по тегам