【问题标题】:How to remove a subdocument from a document, WHERE condition x = true OR condition y = true?如何从文档中删除子文档,WHERE 条件 x = true 或条件 y = true?
【发布时间】:2016-11-02 00:18:25
【问题描述】:

下面是一个名为 Bets 的引用子文档,它嵌入到另一个名为 Users 的模型的属性数组中。当用户删除朋友时,与该特定用户的所有关联投注也应从用户文档中删除(与现在已删除的其他用户是朋友的用户)。

我正在寻找这样做的查询。首先,这里是具体的下注实例。

{
    "_id" : ObjectId("5817cc81233ef74d418d5a1f"),
    "amount" : 50,
    "name" : "Redskins vs Cowboys",
    "description" : "let's see who wins this game",
    "status" : "requested",
    "requestee" : {
        "user" : ObjectId("5817a417146dbb4b380ad1b2"),
        "winnerVote" : null
    },
    "requestor" : {
        "user" : ObjectId("5817a41e146dbb4b380ad1b3"),
        "winnerVote" : null
    },
    "__v" : 0
}

到目前为止,这是我的破坏友谊控制器:

destroy: function(req, res) {
    User.findByIdAndUpdate(req.params.id,
    { $pull: { "friendships": {"friend": req.params.friendId } }, $pull: { "bets": {"requestee.id": req.params.friendId ****OR**** "requestor.id": req.params.friendId}} }, function(err, user) {
      if (err) {
        res.send({error: err});
      } else {
        User.findByIdAndUpdate(req.params.friendId,
          { $pull: { "friendships": {"friend": req.params.id } } }, function(err, user) {
            if (err) {
              res.send({error: err})
            } else {

              res.status(200).send();
            }
          }
        )
      }
    })
  }

如您所见,在第一个'findByIDandUpdate' 查询之后,我有两个$pull 命令。第二个是我试图实现这个我试图产生的新查询的地方。

我想拉注,bet.requesteEE.user === oldFriendID 或 (||) 拉注,bet.requestOR.user === oldFriendID

【问题讨论】:

  • 有一个$or操作符,它接受一个文档数组来匹配表达式,你可以试试下面的方法: $pull: { $or: [ { "bets": {"requestee.id" :friendId } }, { "bets": { "requestor.id":friendId } } ] } 我不确定这是否是更新运算符的有效语法,您可能需要使用 elemMatch。如果您想对多个文档进行更新,您还可以选择将 { multi : true } 作为您的第三个运算符。
  • 似乎无法与 $or 运算符一起使用,但谢谢我非常感谢您的回复:)

标签: javascript node.js mongodb mongoose mongodb-query


【解决方案1】:

您可能必须在 Mongoose 回调中处理这个问题 - 看看这是否有效:

User.findById(req.params.id, function(err, user) {
    // for each bet in user.bets
    user.bets.forEach(function(bet) {
        if (bet.requestee === friendId || bet.requester === friendId) {
            delete bet;
        }
    });
    user.save();
    // Handle response logic here or in the save callback.

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 2021-08-18
    • 1970-01-01
    • 2023-03-28
    • 2017-01-14
    • 2019-03-18
    • 1970-01-01
    • 2018-04-21
    相关资源
    最近更新 更多