使用嵌套的子文档数组更新MongoDB文档

时间:2016-07-19 22:40:35

标签: mongodb

我需要更新看起来像这样的MongoDB文档:

{
    "_id" : ObjectId("A"),
    "participant" : "John Doe",
    "roles" : [{
        "roleId" : ObjectId("AA"),
        "responsibilities" : [{
            "_id" : ObjectID("AAA"),
            "name" : "resp 1"
        }, {
            "_id" : ObjectID("AAB"),
            "name" : "resp 2"
        }]
    }, {
        "roleId" : ObjectId("AB"),
        "responsibilities" : []
    }]
}

更新有两种形式:

  • 删除所有没有责任的角色子文档... 这应该删除角色子文档 _id = AB
  • 添加新角色(如果该角色尚不存在):{ "roleId" : ObjectId("AC"), "responsibilities" : [] }

1 个答案:

答案 0 :(得分:1)

您的第一次更新:

public void unsetAlarm(View v) {
            myIntent = new Intent(noticall.this, MyReceiver.class);
              pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0);

              alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

              alarmManager.cancel(pendingIntent);
           Log.v("ahooooo", "cancelling notification");
       } 

基本上,删除任何的元素(这是multi:true进来的地方)“roles”数组,其中“responsibility”是一个空数组(或大小为0)

您的第二次更新,假设“新角色”是一个空职责数组的角色:

db.getCollection('collection').update({}, 
    {
        $pull: {
            'roles': {
                'responsibilities': {$size: 0}
            }
        }
    }, {multi: true})

查找没有角色数组的文档,其中元素具有空的职责数组,然后使用新的ObjectId推送新角色,或者您可以自己指定一个。

我已经在5个文档的一小部分上测试了这个并且似乎有用,如果您需要任何澄清或者它不起作用,请告诉我。

值得注意的是,查询必须遍历数组$elemMatch的数组是您正在寻找的。修改时,您需要遍历数组$pull是您想要使用的。