0

次のようなシーズンというコレクションがあります。

[ 
  { 
    week: 1,
    matchups: [ 
        {
            home : ObjectId("1"),
            away : ObjectId("2")
        },
        {
            home : ObjectId("3"),
            away : ObjectId("4")
        },

    ],
    _id: 50fc50c9ce87149ee3000007 
  },
  { 
    week: 2,
    matchups: [ 
        {
            home : ObjectId("3"),
            away : ObjectId("1")
        },
        {
            home : ObjectId("2"),
            away : ObjectId("4")
        },
    ],
    _id: 50fc50c9ce87149ee3000008 
  }
]

ホームチームまたはアウェイチームがObjectId( "1")であるすべての対戦を取得しようとしています。リターンを次のようにしたいと思います。

[ 
  { 
    week: 1,
    matchups: [ 
        {
            home : ObjectId("1"),
            away : ObjectId("2")
        }

    ],
    _id: 50fc50c9ce87149ee3000007 
  },
  { 
    week: 2,
    matchups: [ 
        {
            home : ObjectId("3"),
            away : ObjectId("1")
        }
    ],
    _id: 50fc50c9ce87149ee3000008 
  }
]

db.season.find()を使用してこの結果を取得することは可能ですか?

4

2 に答える 2

2

matchups一致する可能性のある要素が最大で 1 つある限り、$elemMatch射影演算子を使用してこれを行うことができます。

db.seasons.find(
    {$or: [{'matchups.home': ObjectId("1")},{'matchups.away': ObjectId("1")}]}, 
    {week: 1, matchups: {
        $elemMatch: {$or: [{home: ObjectId("1")},{away: ObjectId("1")}]}
    }});

の無効性に関する Wes と同じ警告ObjectId("1")

于 2013-01-21T02:55:27.973 に答える
1

.find ではなく、.aggregate を使用:

db.seasons.aggregate(
  {$match:{$or:[{"matchups.home":ObjectId("1")}, {"matchups.away":ObjectId("1")}]}}, 
  {$unwind:"$matchups"}, 
  {$match:{$or:[{"matchups.home":ObjectId("1")}, {"matchups.away":ObjectId("1")}]}}, 
  {$group:{_id:"$_id", week:{$first:"$week"}, matchups:{$addToSet:"$matchups"}}});
  1. あなたのチームを持つものに対する最初の一致フィルター (あなたのチームを含まないレコードがいくつかある場合、残りはより効率的になります)
  2. マッチアップを解き放つ
  3. 2 番目のマッチ フィルタは、自分のチームを持つもののみに適用されます
  4. グループは再びあなたの記録を再構築します

制限は、集約されたドキュメント サイズです。お役に立てれば。

.find でできる最善の方法は、最初の一致であり、アプリケーション側で一致をフィルタリングします。

また、ObjectId("1") は無効です。参考までに。

于 2013-01-21T02:27:44.003 に答える