【问题标题】:update array with $ is not working in mongodb-native nodejs使用 $ 更新数组在 mongodb-native nodejs 中不起作用
【发布时间】:2011-05-29 16:21:52
【问题描述】:

我的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)

       });

错误返回空值和回调也有效。但是,数据库中的数据没有更新。

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

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

【问题讨论】:

    标签: mongodb node.js


    【解决方案1】:

    已修复,问题是 taskId 不是数字。

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

    【讨论】:

      【解决方案2】:

      那是因为你有一些错别字。查看 cmets:

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

      【讨论】:

        猜你喜欢
        • 2014-07-05
        • 2016-06-09
        • 2013-03-15
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-24
        相关资源
        最近更新 更多