使用$更新数组在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中工作正常,但不能在你的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) }); 

错误返回空值和callback也工作。 但是,数据库中没有更新数据。

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

完整的源代码在: https : //github.com/saturngod/tatoo/blob/master/data-provider.js

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

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