MongoDB如何从数组中移除值(如果存在),否则添加

MongoDB如何从数组中移除值(如果存在),否则添加,mongodb,Mongodb,我有文件 { "_id" : ObjectId("5aebf141a805cd28433c414c"), "forumId" : ObjectId("5ae9f82989f7834df037cc90"), "userName" : "Name", "usersLike" : [ "1","2" ], "comment" : "Comment", } 如果值存在,我想从usersLike数组中删除值,如果值不存在,则添加值 例如

我有文件

 {
    "_id" : ObjectId("5aebf141a805cd28433c414c"),
    "forumId" : ObjectId("5ae9f82989f7834df037cc90"),
    "userName" : "Name",
    "usersLike" : [ 
        "1","2"
    ],
    "comment" : "Comment",
}
如果值存在,我想从usersLike数组中删除值,如果值不存在,则添加值

例如:

如果我尝试将1推入usersLike,它应该会返回

{
    "_id" : ObjectId("5aebf141a805cd28433c414c"),
    "forumId" : ObjectId("5ae9f82989f7834df037cc90"),
    "userName" : "Name",
    "usersLike" : [ 
        "2"
    ],
    "comment" : "Comment",
}
我如何查询它?。

试试这个:

db.collectionName.update({_id:ObjectId("597afd8200758504d314b534")},{$pull:{'usersLike':"1"}}, {multi: true})

Mongodb不支持条件推送或拉送更新。但是,您仍然可以使用“查找”:

 db.collectionName.find({_id:ObjectId("597afd8200758504d314b534"),usersLike:{$in:["1"]}}).pretty()
如果
id
存在于
usersLike
中,则拉动else按钮

或者,您可以使用更新查询作为:

db.collectionName.update({
    _id: ObjectId("597afd8200758504d314b534"),
    usersLike: {
        $in: ["1"]
    }
    }, {
        $pull: { 'usersLike': "1" }
    }, { multi: true })
要推送,您可以使用:

db.collectionName.update({
   _id:ObjectId("597afd8200758504d314b534"), 
   usersLike:{$nin:["1"]
}},{
   $push:{'usersLike':"1"}
}, {multi: true})
试试这个

if db.collectionName.find({'_id':ObjectId("5aebf141a805cd28433c414c"),'usersLike:{'$in:['1']}}).count() > 0:

    db.collectionName.update({'_id':ObjectId("5aebf141a805cd28433c414c")},{'$pull':{'usersLike':'1'}})

else:
    db.collectionName.update({'_id':ObjectId("5aebf141a805cd28433c414c")},{'$addToSet':{'usersLike':'1'}})

MongoDB版本4.2+引入了。这意味着我们现在可以在更新时使用聚合运算符。这给了我们很大的力量

db.collection.updateOne(
    {
        _id: ObjectId("597afd8200758504d314b534")
    },
    [
        {
            $set: {
                usersLike: {
                    $cond: [
                        {
                            $in: ["1", "$usersLike"]
                        },
                        {
                            $setDifference: ["$usersLike", ["1"]]
                        },
                        {
                            $concatArrays: ["$usersLike", ["1"]]
                        }
                    ]
                }
            }
        }
    ]
)

值是否存在于中?数组
usersLike
存在,或者在
usersLike
中应该存在一个特定的值?请给出一个更具体的例子?如果数组usersLike中存在值1,则应该删除它。否则,应该将值1添加到数组usersLike中。我认为更重要的是,为什么您不知道它的存在?例如,如果你试图在facebook上建立类似“ThisSite”或“likes”的网站,那么页面中的数据实际上知道当前用户已经拥有投票权。因此,如果我“向上投票”这个问题,然后稍后再回到这个页面,页面数据的一部分包括“我的投票”的记录,所以在我再次发送投票请求之前,我可以告诉你我已经投票了,因此没有必要发送请求。我想你只是在这些情况下试图“盲切换”这些值,但这并不是正确的方法。如上所述,您的“客户”应该已经知道用户是否投票/喜欢。有关更多详细信息,请参阅。无法使用此查询完成。。。此查询将只提取(
$pull
)id,不能添加(
$push
),正如问题所述,
$push
$pull
应该同时完成……Mongodb不支持有条件的推送或推送更新。但是,您仍然可以使用find(db.collectionName.find({u id:ObjectId(“597afd8200758504d314b534”)、usersLike:{$in:[“1”]}}}).pretty())来完成此操作,如果id存在于usersLike中,而不是pull-else-push.yes,则可以完成此操作。。。但他希望在一个查询中得到它,这是不可能的