我的数据库中有游戏收藏:
var game = {
players: [{username:"user1", status:"played"},
{username:"user2", status:"accepted"}]
}
据我了解这样的查询:db.games.find({"players.status":"played"})
会给我所有至少有一名玩家状态为“已玩”的游戏。如何找到所有玩家状态为“已玩”的游戏?
我的数据库中有游戏收藏:
var game = {
players: [{username:"user1", status:"played"},
{username:"user2", status:"accepted"}]
}
据我了解这样的查询:db.games.find({"players.status":"played"})
会给我所有至少有一名玩家状态为“已玩”的游戏。如何找到所有玩家状态为“已玩”的游戏?
如果您只有“已播放”以外的一种状态,请使用以下查询:
db.games.find({ "players.status": { $ne:"accepted" } })
您可以调整查询以处理更多状态值,只要它们在查询时都是已知的。
我也遇到了这个问题。我试图使用$all
并且几乎没有进展。它有助于改变我对问题的看法并$not
改用它。我写了我在这里找到的东西。
在您的情况下,您应该能够执行以下操作:
db.games.find({
players: {
$not: {
$elemMatch: {
status: { $ne: "played" }
}
}
}
})
查找所有播放器状态不等于的文档"played"
并返回该集合的倒数。这样做的好处是您永远不必担心添加更多状态值。
使用聚合框架的 $unwind 特性:
db.collection.aggregate([{$unwind:"$players.status"},{$match:{"players.status":"played"},{$project:{"_id":0,"players.status ":1}}])
(看看这个答案:https ://stackoverflow.com/a/15082321/1214167 )