9

我的数据库中有游戏收藏:

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

据我了解这样的查询:db.games.find({"players.status":"played"})会给我所有至少有一名玩家状态为“已玩”的游戏。如何找到所有玩家状态为“已玩”的游戏?

4

3 回答 3

12

如果您只有“已播放”以外的一种状态,请使用以下查询:

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

您可以调整查询以处理更多状态值,只要它们在查询时都是已知的。

于 2012-05-08T04:45:30.387 回答
0

我也遇到了这个问题。我试图使用$all并且几乎没有进展。它有助于改变我对问题的看法并$not改用它。我写了我在这里找到的东西

在您的情况下,您应该能够执行以下操作:

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

查找所有播放器状态不等于的文档"played"并返回该集合的倒数。这样做的好处是您永远不必担心添加更多状态值。

于 2020-03-10T23:29:32.600 回答
-1

使用聚合框架的 $unwind 特性:

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

(看看这个答案:https ://stackoverflow.com/a/15082321/1214167 )

于 2014-04-28T16:36:52.170 回答