使用$更新数组在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) });