2016-09-05 2 views
0

Я хотел бы фильтровать вложенные свойства после поиска в mongodb. Я не могу найти подходящий пример в документации. Я использую агрегацию, и на последнем этапе мне нужно пройти несколько условий. Я хочу фильтровать по свойствам, затянутым на этапе поиска.Как использовать матч после присоединения к MongoDb?

Это мой запрос:

 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_configs? – notionquest

+0

Хорошо, через минуту. Но вы имеете в виду лигу и события, да? Почему league_configs? – magos

+0

Да, сбор событий. Укажите вложенный атрибут, который вы хотели бы назвать из этой коллекции в качестве примера? – notionquest

ответ

1

Вот запрос. Вы можете использовать "$ elemMatch", чтобы отфильтровать данные от Коллекция "events". Кроме того, для ясности я изменил результат поиска как «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") 
     } 
    ] 
} 

Test Case 2: - я запускал тот же самый запрос для лиги ид = 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" : 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") 
} 

Это событие имеет идентификатор лиги (ObjectId ("57ce74076eae72aafab03013")), однако IsDeleted и isCalculated атрибуты устанавливаются так. Таким образом, запрос не извлек этот документ.

{ 
    "_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, всегда возвращающие целую коллекцию событий с соответствующим лигом. У меня была точно такая же проблема с моим прежним запросом. Не могли бы вы проверить свой запрос с документами, которые не соответствуют условиям? – magos

+0

Я изменил значение флага и протестировал его.Он работал отлично I.e. не принесло никаких результатов. – notionquest

+0

Здесь у нас есть ответ. Запрос возвращает событие с isDeleted, установленным в true. https://postimg.org/image/6bcn1t5v3/ – magos