Mongodb find a document with all subdocuments satisfying a condition

前端 未结 3 1126
时光说笑
时光说笑 2020-12-11 03:30

I have Game collection in my DB:

var game = {
  players: [{username:\"user1\", status:\"played\"},
            {username:\"user2\", status:\"accepted\"}]
}
<         


        
相关标签:
3条回答
  • 2020-12-11 03:44

    If you only have one other status than "played" use the query:

    db.games.find({ "players.status": { $ne:"accepted" } })
    

    You can adjust the query to handle more status values, as long as they are all known at the time of the query.

    0 讨论(0)
  • 2020-12-11 03:49

    Use the $unwind feature of the aggregation framework:

    db.collection.aggregate([{$unwind:"$players.status"},{$match:{"players.status":"played"},{$project:{"_id":0,"players.status":1}}])

    (check out this answer: https://stackoverflow.com/a/15082321/1214167)

    0 讨论(0)
  • 2020-12-11 03:58

    I ran into this problem too. I was trying to use $all and making little to no progress. It helped to flip my perspective on the problem and use $not instead. I wrote about what I found here.

    In your situation, you should be able to do something like this:

    db.games.find({
      players: {
        $not: {
          $elemMatch: {
            status: { $ne: "played" }
          }
        }
      }
    })
    

    Find all documents with a player status not equal to "played" and return the inverse of that set. The nice thing about this is that you never have to worry about adding more status values.

    0 讨论(0)
提交回复
热议问题