MongoDB: 如何根据是否找到数组对象来添加或更新数组对象?
MongoDB: How to add or update array object depending if its found or not?
我可以使用什么 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' 频道的状态。我想要更新到:
为集合中的所有对象添加一个新的 channelStatus {"channel" : "BAR", "status" : "done"}。
如果一个对象已经有一个 "channel" 的 channelStatus : "BAR",它只会将该对象的 "status" 更新为 "done"。
如果我简单地使用 addToSet,它会添加重复项,例如:channelStatuses:[{"channel" : "BAR", "status" : "done"}, {"channel" : "BAR", "status" : "error"}]
我可以接受的方法是先删除旧对象,然后使用 addToSet 添加新对象。但是有没有办法在一次更新中做到这一点?
如果一个对象已经有一个 "channel" : "BAR"
的 channelStatus,通过 $set
更新 status
的值
> db.collection.update({'channelStatuses.channel': {$eq: 'BAR'}},
{$set: {'channelStatuses.$.status': 'done'}}, {multi: true})
否则,通过 $addToSet
添加新的 channel
到 channelStatuses
> db.collection.update({'channelStatuses.channel': {$ne: 'BAR'}},
{$addToSet: {'channelStatuses': {channel: 'BAR', status: 'done'}}},
{multi: true})
我可以使用什么 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' 频道的状态。我想要更新到:
为集合中的所有对象添加一个新的 channelStatus {"channel" : "BAR", "status" : "done"}。
如果一个对象已经有一个 "channel" 的 channelStatus : "BAR",它只会将该对象的 "status" 更新为 "done"。
如果我简单地使用 addToSet,它会添加重复项,例如:channelStatuses:[{"channel" : "BAR", "status" : "done"}, {"channel" : "BAR", "status" : "error"}]
我可以接受的方法是先删除旧对象,然后使用 addToSet 添加新对象。但是有没有办法在一次更新中做到这一点?
如果一个对象已经有一个 "channel" : "BAR"
的 channelStatus,通过 $set
status
的值
> db.collection.update({'channelStatuses.channel': {$eq: 'BAR'}},
{$set: {'channelStatuses.$.status': 'done'}}, {multi: true})
否则,通过 $addToSet
channel
到 channelStatuses
> db.collection.update({'channelStatuses.channel': {$ne: 'BAR'}},
{$addToSet: {'channelStatuses': {channel: 'BAR', status: 'done'}}},
{multi: true})