【问题标题】:Update field in Object array in Meteor (mongoDB)Meteor(mongoDB)中对象数组中的更新字段
【发布时间】:2014-11-05 20:55:43
【问题描述】:

我有以下文件:

{
   "gameName":"Shooter",
   "details":[
      {
         "submitted":1415215991387,
         "author":"XYZ",
         "subPlayer":{
            "members":{
               "squad1":[
                  {
                     "username":"John",
                     "deaths":0
                  }
               ]
            },
            "gameSlug":"0-shooter"
         }
      }
   ],
   "userId":"foL9NpoZFq9AYmXyj",
   "author":"Peter",
   "submitted":1415215991608,
   "lastModified":1415215991608,
   "participants":[
      "CXRR4sGf5AdvSjdgc",
      "foL9NpoZFq9AYmXyj"
   ],
   "slug":"1-shooterConv",
   "_id":"p2QQ4TBwidjeZX6YS"
}

...和下​​面的 Meteor 方法:

Meteor.methods({
    updateDeaths: function(gameSlug, user, squad) {
            Stats.update({details.subPlayer.gameSlug: gameSlug}, ...}); // ???
    }
});

我的目标是更新字段deaths。该方法有参数user,它是用户对象(用户名=user.username)。此外,参数squad 是字符串形式的小队名称,例如squad1.

我该怎么做?

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

    你应该使用这样的东西:

    db.collection.update(
      {'userId':'foL9NpoZFq9AYmXyj', 'details.subPlayer.gameSlug':'0-shooter'}, 
      {'$set': 
         {'details': [{
              'subPlayer': {
                   'members': {
                      'squad1':[{'username':'John','death':1}]
                   }
              }
           }]
         }
      }
    )
    

    更新:

    另外,也许更好的方法是使用 find().snapshot().forEach()。但我不知道 Meteor 是如何支持它的。示例:

    Stats.find({'userId':'foL9NpoZFq9AYmXyj', 'details.subPlayer.gameSlug':'0-shooter' }).map(function (e) {
        e.details.forEach(function (d) {
            var squad = 'squad1';
            d.subPlayer.members[squad].forEach(function (s) {
                s.deaths = 10000;
            });
        });
        Stats.update({'_id': e._id}, e);
    });
    

    【讨论】:

    • 感谢您的帮助!但是,我认为 Meteor 中没有此功能。 TypeError: Object [object Object] has no method 'findAndModify'.
    • @user3475602 我更新了我的答案。您可以使用db.collection.update() 代替findAndModify()
    • 谢谢!这样可行。但是,现在在执行此更新后,details.submitteddetails.authordetails.subPlayer.gameSlug 字段将被删除。你知道我该如何解决这个问题吗?
    • 此外,如何使用字符串变量动态设置squad 字段?例如var squad = 'squad1';.
    • @user3475602 请参阅 upd 部分。
    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2021-07-24
    • 2020-05-08
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多