2016-06-20 1 views
0

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

Вот мой документ:

{ 
    "_id" : ObjectId("5758098356e3930537af15dd"), 
    "manpower_data" : [ 
     { 
      "_id" : ObjectId("5758098356e3930537af15de"), 
      "created" : ISODate("2016-06-08T12:03:15.387Z"),    
      "designation" : "Visiting Evaluator",    
      "evaluatorContactNumber" : "987654321",    
      "evaluatorName" : "Dumy User1", 
      "dealerCodeFor" : "ZSAE876", 
      "region" : "Gurgaon" 
     }, 
     { 
      "_id" : ObjectId("5758098356e3930537af15de"), 
      "created" : ISODate("2016-06-08T12:03:15.387Z"),    
      "designation" : "Resident Evaluator",    
      "evaluatorContactNumber" : "987654321",    
      "evaluatorName" : "Dumy User2", 
      "dealerCodeFor" : "ZSAE877", 
      "region" : "Delhi" 
     } 
    ] 
} 

Когда я запускаю этот запрос,

db.mycollection.find({"manpower_data.dealerCodeFor":"ZSAE876"});

Это возвращает меня все два суб документа, но я хочу, чтобы получить только те manpower data, который соответствующий dealerCodeFor.

ответ

2

Для фильтрации элементов массива необходимо выполнить фазу projection с $elemMatch. Пожалуйста, смотрите пример ниже:

db.collection.find({ 
    "manpower_data.dealerCodeFor" : "ZSAE876" 
}, { 
    manpower_data : { 
     $elemMatch : { 
      dealerCodeFor : "ZSAE876" 
     } 
    } 
}) 
+0

Он работает. Спасибо :) –

+1

ПРИМЕЧАНИЕ: - Это приведет к возврату первого совпадающего объекта из массива. Если их несколько, вы не получите их всех. – Shrabanee

2

Вы можете использовать $filter из aggregate-mongodb для достижения этой цели.

Попробуйте следующее: -

db.collection.aggregate([ 
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"} 
}, 
{ 
    "$project": { 
     "manpower_data": { 
      "$filter": { 
       "input": "$manpower_data", 
       "as": "o", 
       "cond": { 
        "$eq": ["$$o.dealerCodeFor", "ZSAE876"] 
       } 
      } 
     } 
    } 
}]) 

Запустив выше запрос, manpower_data будет возвращать только те объекты, которые соответствует вашему состоянию.

EDIT: -

Для версии меньше 2.6.x, попробуйте следующий запрос: -

db.collection.aggregate([ 
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"} 
}, 
{ "$unwind": "$manpower_data" }, 
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"} 
}, 
{ 
    "$group": { 
     "$_id": "$_id", 
     "manpower_data": { "$push": "$manpower_data" } 
    } 
}]) 
+0

@Shrebanee я запускаю выше запрос, но дал мне ошибку 'неперехваченного исключения: агрегат не удался: { \t "ERRMSG": "исключение: недействительный оператор '$' фильтр", \t "код": 15999, \t "КИ" : 0 } ' –

+0

Зачем здесь агрегат? это дробовик, чтобы убить маленькую муху :-), – profesor79

+0

@ profesor79 Я думал, если в массиве есть несколько объектов, соответствующих запросу, проецирование всех этих объектов может быть выполнено посредством агрегата. – Shrabanee

Смежные вопросы