2016-09-05 10 views
0

mongodbで検索した後にネストされたプロパティをフィルタリングしたいと思います。私は文書化に適切な例を見つけることができません。私は集約を使用し、最後の段階ではいくつかの条件を満たす必要があります。ルックアップステージで強化されたプロパティでフィルタリングしたいMongoDbでjoin後にmatchを使用するには?

これが私のクエリです:

 db.collection('leagues').aggregate([ 
        { 
         $match: { 
          _id: ObjectID(leagueId) 
         } 
        }, 
        { 
         $lookup: { 
          from: "league_configs", 
          localField: "_id", 
          foreignField: "leagueId", 
          as: "configs" 
         } 
        }, 
        { 
         $lookup: { 
          from: "events", 
          localField: "_id", 
          foreignField: "leagueId", 
          as: "events" 
         } 
        }, 
        { 
         $match: { 
          $and: [{ 
           "events": { 
            "isCalculated": { 
             $eq: false 
            }, 
            "isDeleted": { 
             $eq: false 
            }, 
            "startDate": { 
             $lte: new Date() 
            } 
           }, 
          }] 
         } 
        } 
      ]) 

例リーグオブジェクト:

{ 
"_id" : ObjectId("57c6bf5934db7e18b8af650c"), 
"name" : "League1", 
"adminId" : ObjectId("57c5a08b8857ad1da099e8de"), 
"isStarted" : false, 
"isFinished" : false, 
"users" : [ 
    ObjectId("57c5a08b8857ad1da099e8de") 
], 
"isPublic" : true, 
"createdDate" : "2016-08-31T13:28:25+02:00", 
"updatedDate" : ISODate("2016-08-31T12:28:09.064Z"), 
"currentStage" : 1, 
"isDeleted" : false 
} 

例イベントオブジェクト:

{ 
"_id" : ObjectId("57c6bfca34db7e18b8af650f"), 
"home" : "home", 
"guest" : "guest", 
"description" : null, 
"result" : "X", 
"resultHome" : 1, 
"resultGuest" : 1, 
"startDate" : ISODate("2016-08-31T18:30:00.000Z"), 
"type" : "1", 
"specialPoints" : null, 
"leagueStage" : 1, 
"isDeleted" : false, 
"isCalculated" : false, 
"leagueId" : ObjectId("57c6bf5934db7e18b8af650c"), 
"updatedDate" : ISODate("2016-09-02T06:52:45.544Z") 
} 

任意のアドバイス?

+0

leagueとleague_configsコレクションのサンプルドキュメントを追加してください。 – notionquest

+0

さて、分で。しかし、あなたはリーグと出来事を意味しますか?なぜleague_configsですか? – magos

+0

はい、イベント収集です。そのコレクションから参照したいネストされた属性を例として指定してください。 – notionquest

答えて

1

ここにクエリがあります。 「$ elemMatch」を使用して、「イベント」コレクションのデータをフィルタリングできます。また、わかりやすくするために、検索結果を「イベント」ではなく「events_docs」に変更しました。

"league_configs"の最初のルックアップを削除しました。そのコレクションデータがないためです。これを追加して完全なクエリを試すことができます。

以下のクエリは、入力したデータで正常に動作します。

問合せ: -

db.leagues.aggregate([ 
        { 
         $match: { 
          _id: ObjectId("57c6bf5934db7e18b8af650c") 
         } 
        }, 
         { 
         $lookup: { 
          from: "events", 
          localField: "_id", 
          foreignField: "leagueId", 
          as: "events_docs" 
         } 
        }, 
        { 
         $match: { "events_docs": {$elemMatch: {"isDeleted" : false,"isCalculated" : false, "startDate": { 
             $lte: new Date() 
            }} } } 

        } 

      ]); 

出力: -

{ 
    "_id" : ObjectId("57c6bf5934db7e18b8af650c"), 
    "name" : "League1", 
    "adminId" : ObjectId("57c5a08b8857ad1da099e8de"), 
    "isStarted" : false, 
    "isFinished" : false, 
    "users" : [ 
     ObjectId("57c5a08b8857ad1da099e8de") 
    ], 
    "isPublic" : true, 
    "createdDate" : "2016-08-31T13:28:25+02:00", 
    "updatedDate" : ISODate("2016-08-31T12:28:09.064Z"), 
    "currentStage" : 1, 
    "isDeleted" : false, 
    "events_docs" : [ 
     { 
      "_id" : ObjectId("57c6bfca34db7e18b8af650f"), 
      "home" : "home", 
      "guest" : "guest", 
      "description" : null, 
      "result" : "X", 
      "resultHome" : 1, 
      "resultGuest" : 1, 
      "startDate" : ISODate("2016-08-31T18:30:00.000Z"), 
      "type" : "1", 
      "specialPoints" : null, 
      "leagueStage" : 1, 
      "isDeleted" : false, 
      "isCalculated" : false, 
      "leagueId" : ObjectId("57c6bf5934db7e18b8af650c"), 
      "updatedDate" : ISODate("2016-09-02T06:52:45.544Z") 
     } 
    ] 
} 

テストケース2: - IリーグのID =のObjectId( "57ce74076eae72aafab03013" のために、同じクエリを実行しました)。クエリはゼロのドキュメントをフェッチしました。

リーグドキュメント: -

{ 
    "_id" : ObjectId("57ce74076eae72aafab03013"), 
    "name" : "League1", 
    "adminId" : ObjectId("57c5a08b8857ad1da099e8de"), 
    "isStarted" : false, 
    "isFinished" : false, 
    "users" : [ 
     ObjectId("57c5a08b8857ad1da099e8de") 
    ], 
    "isPublic" : true, 
    "createdDate" : "2016-08-31T13:28:25+02:00", 
    "updatedDate" : ISODate("2016-08-31T12:28:09.064Z"), 
    "currentStage" : 1, 
    "isDeleted" : false 
} 

イベント資料: -

このイベントは、任意のリーグIDを持っていません。

{ 
    "_id" : ObjectId("57ce74256eae72aafab03014"), 
    "home" : "home", 
    "guest" : "guest", 
    "description" : null, 
    "result" : "X", 
    "resultHome" : 1, 
    "resultGuest" : 1, 
    "startDate" : ISODate("2016-08-31T18:30:00.000Z"), 
    "type" : "1", 
    "specialPoints" : null, 
    "leagueStage" : 1, 
    "isDeleted" : false, 
    "isCalculated" : false, 
    "updatedDate" : ISODate("2016-09-02T06:52:45.544Z") 
} 

このイベントは、リーグID(ObjectIdが( "57ce74076eae72aafab03013"))、しかしisDeletedを持っていると属性がtrueに設定されている計算されます。したがって、クエリはこのドキュメントを取得しませんでした。

{ 
    "_id" : ObjectId("57ce74ea6eae72aafab03015"), 
    "home" : "home", 
    "guest" : "guest", 
    "description" : null, 
    "result" : "X", 
    "resultHome" : 1, 
    "resultGuest" : 1, 
    "startDate" : ISODate("2016-08-31T18:30:00.000Z"), 
    "type" : "1", 
    "specialPoints" : null, 
    "leagueStage" : 1, 
    "isDeleted" : true, 
    "isCalculated" : true, 
    "leagueId" : ObjectId("57ce74076eae72aafab03013"), 
    "updatedDate" : ISODate("2016-09-02T06:52:45.544Z") 
} 
+0

それは正常に動作していないようです。あなたのクエリは$ elemMatch条件を無視して、常に適切なleagueIdでイベントの全コレクションを返します。私は以前の質問とまったく同じ問題を抱えていました。条件を満たさない文書で質問をテストしてください。 – magos

+0

私はフラグの値を変更し、それをテストしました。それはうまく働いた。結果をもたらさなかった。 – notionquest

+0

ここに私たちは応答を持っています。クエリはisDeletedがtrueに設定されたイベントを返します。 https://postimg.org/image/6bcn1t5v3/ – magos

関連する問題