使用$的更新数组在mongodb-native nodejs中不起作用

时间:2011-05-29 16:21:53

标签: mongodb node.js

我的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中工作正常,但无法在你的node-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)

       });

错误返回null值并且回调也正常工作。但是,数据库中的数据未更新。

更新: 我发现'todo.id':taskId找不到任何行。它在mongo cli中工作但在mongodb-native nodejs中不起作用

完整来源: https://github.com/saturngod/tatoo/blob/master/data-provider.js

2 个答案:

答案 0 :(得分:1)

修正了,问题是taskId不是数字。

task_collection.update({user:username,'todo.id':Math.floor(taskId)}, {"$set":{"todo.$.done":1}},{safe:true},function(error, result){

答案 1 :(得分:0)

那是因为你有一些错别字。见评论:

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