0

我可以使用什么 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”通道的状态。我希望更新为:

  1. 为集合中的所有对象添加一个新的 channelStatus {"channel" : "BAR", "status" : "done"}。

  2. 如果一个对象已经有一个带有 "channel" : "BAR" 的 channelStatus,它只会将该对象的 "status" 更新为 "done"。

如果我简单地使用 addToSet,它会添加重复项,例如:channelStatuses:[{"channel" : "BAR", "status" : "done"}, {"channel" : "BAR", "status" : "error "}]

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

4

1 回答 1

1

如果一个对象已经有一个 channelStatus "channel" : "BAR",更新statusthrough$set

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

否则,将 new 添加channelchannelStatusesthrough$addToSet

> db.collection.update({'channelStatuses.channel': {$ne: 'BAR'}}, 
                       {$addToSet: {'channelStatuses': {channel: 'BAR', status: 'done'}}}, 
                       {multi: true})
于 2016-03-21T12:37:16.470 回答