我在mongoDB中有一个字符串数组(BrowsableProperties
)。
我想切换该数组中的一个元素:如果该元素存在于数组中,请将其删除,否则按该元素。
示例:
CustomObjectWrapper
最终数组:
ObjectIds
我的用例:
我正在创建一个博客网站,并在“博客模式”中存储了每个喜欢该博客的用户的ID,以便在向用户显示博客时突出显示“喜欢”按钮。
答案 0 :(得分:5)
如果要更新文档,则可以使用 update 中的管道。但是此功能在MongoDB 4.2或更高版本中可用。
db.collection.update(
{ },
[
{
$set: {
arr: {
$cond: [ { $in: [ element, "$arr" ] },
{ $setDifference: [ "$arr", [ element ] ] },
{ $concatArrays: [ "$arr", [ element ] ] }
]
}
}
}
]
)
注意::假设变量element
是 string 值。
如果您只是查询,则可以使用以下汇总:
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 } } ) )
答案 1 :(得分:1)
它可能不是最佳解决方案,但是很简单。您可以使用$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");