MongoDB:如何添加或更新数组对象,具体取决于是否找到它?

时间:2016-03-21 11:50:00

标签: arrays mongodb mongodb-update

我可以使用什么mongoDB操作将对象添加到数组中,或者,如果对象已经在数组中,则更新其中一个值。

以下是我的mongodb数据示例:

    {
      "_id" : "1",
      "channelStatuses" : [
        {
          "channel" : "FOO",
          "status" : "done"
        }
      ]
    },
    {
      "_id" : "2",
      "channelStatuses" : [
        {
          "channel" : "BAR",
          "status" : "done"
        }
      ]
    },
    {
      "_id" : "3",
      "channelStatuses" : [
        {
          "channel" : "BAZ",
          "status" : "error"
        }
      ]
    },
    {
      "_id" : "3",
      "channelStatuses" : []
    }

我想要做的是使用mongodb-update来更新集合中的所有数据。假设我需要修改所有' BAR' -channels的状态。我想要更新:

  1. 添加新的channelStatus {"频道" :" BAR"," status" :"完成"}到集合中的所有对象。

  2. 如果某个对象已经有一个带有" channel"的channelStatus :" BAR",它只会更新"状态"完成"完成"那个对象。

  3. 如果我只是使用addToSet,它会添加重复项,例如:channelStatuses:[{" channel" :" BAR"," status" :"完成"},{"频道" :" BAR"," status" :"错误"}]

    我可以接受的方法是首先删除旧对象,然后使用addToSet添加新对象。但是有没有办法在一次更新中执行此操作?

1 个答案:

答案 0 :(得分:1)

如果某个对象已经有"channel" : "BAR"的channelStatus,请通过status更新$set的值

> db.collection.update({'channelStatuses.channel': {$eq: 'BAR'}}, 
                       {$set: {'channelStatuses.$.status': 'done'}}, {multi: true})

否则,通过channel

channelStatuses添加新的$addToSet
> db.collection.update({'channelStatuses.channel': {$ne: 'BAR'}}, 
                       {$addToSet: {'channelStatuses': {channel: 'BAR', status: 'done'}}}, 
                       {multi: true})