2016-11-01 18 views
0

下面是一個名爲Bets的引用子文檔,它嵌入另一個稱爲「用戶」模型的屬性數組中。當用戶刪除好友時,與該特定用戶關聯的所有投注也應從用戶文檔中刪除(與已刪除的其他用戶成爲好友的用戶)。如何從文檔中刪除子文檔,WHERE條件x = true或條件y =真?

我正在尋找這樣做的查詢。首先,這裏是具體的賭注實例。

{ 
    "_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 OR(||)拉BETS,其中bet.requestOR.user === oldFriendID

+0

有是$或運算符,它需要一系列文檔來匹配表達式,您可以嘗試以下內容: $ pull:{$或:[{「bets」:{「requestee.id」:friendId}},{「賭注「:{」requestor.id「:friendId}}]} 我不確定這是否是有效的語法對於更新操作員,您可能需要使用elemMatch。 如果您想對多個文檔進行更新,您還可以選擇{multi:true}作爲第三個操作符。 – dyouberg

+0

似乎沒有與$或運營商的工作,但謝謝你,我絕對讚賞迴應:) – user7024499

回答

0

您可能必須在貓鼬回調來處理這一點 - 看看,如果這個工程:

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. 

});