我在mongoDB中有一个字符串数组(MongoDB)。我想在数组中切换一个元素:如果数组中存在该元素,请删除它,否则就推那个元素。
示例:
arr = ["5b608c0769698c3990c64ef3","5b608c0769698c3990c64ef4"]
element = ["5b608c0769698c3990c64ef3"]最终数组:
arr = ["5b608c0769698c3990c64ef4"]我的用例:
我正在创建一个博客网站,并在博客模式中存储每个喜欢该博客的用户的id,以便在向用户显示博客时,我可以突出显示类似的按钮。
发布于 2020-06-15 03:39:25
如果要更新文档,则可以在更新中使用管道。但是这个特性可以在MongoDB版本4.2或更高版本中使用。
db.collection.update(
{ },
[
{
$set: {
arr: {
$cond: [ { $in: [ element, "$arr" ] },
{ $setDifference: [ "$arr", [ element ] ] },
{ $concatArrays: [ "$arr", [ element ] ] }
]
}
}
}
]
)注意:假设变量element是字符串值的。
如果您只是在查询,可以使用以下聚合:
db.collection.aggregate([
{
$addFields: {
arr: {
$cond: [ { $in: [ element, "$arr" ] },
{ $setDifference: [ "$arr", [ element ] ] },
{ $concatArrays: [ "$arr", [ element ] ] }
]
}
}
}
] )但是,如果您使用的MongoDB版本早于4.2,那么您可以使用上面的聚合输出来更新文档:
db.collection.aggregate( [
// aggregation pipeine from above ...
] ).forEach( doc => db.collection.updateOne( { _id: doc._id }, { $set: { arr: doc.arr } } ) )发布于 2020-06-15 05:54:44
这也许不是最好的解决办法,但很简单。可以使用$addToSet将元素添加到数组中,如果修改了数组,则可以使用nModified进行检查。0表示它已经存在,而1表示您向它添加了新元素。
所以,您使用猫鼬,正如您说的,然后您有一个模型,让我们说Post。我不知道你用的是女巫后端语言,但我会在这里用node.js展示它:
let result = await Post.updateOne({ _id: "someId" }, {
$addToSet: {
arr: element
}
})
if(result.nModified === 0){
//0 means, no modifikation, that means its already liked
await Post.updateOne({ _id: "someId" }, {
$pull: {
arr: element
}
})
}
response.send("Done");https://stackoverflow.com/questions/51618537
复制相似问题