9

DBにゲームコレクションがあります。

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

私がこのようなクエリを理解している限りdb.games.find({"players.status":"played"})、少なくとも1人のプレーヤーのステータスが「プレイ済み」であるすべてのゲームが表示されます。ステータスが「プレイ済み」のすべてのプレーヤーがいるゲームを見つけるにはどうすればよいですか?

4

3 に答える 3

12

「再生済み」以外のステータスが1つしかない場合は、次のクエリを使用します。

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 に答える