2017-02-07 11 views
0

У меня есть эта проблема. У меня есть эта база данных в MongoDB:Как запросить mongoDB с помощью «find»

{ 
"_id" : ObjectId("585fe33d3c63b4a81e00002b"), 
"class" : [ 
    { 
     "name" : "class 1", 
     "people" : [ 
      { 
       "id" : "58596", 
       "name" : "mark", 
      }, 
      { 
       "id" : "45643", 
       "name" : "Susan", 
      }, 
      { 
       "id" : "85952", 
       "name" : "Loris", 
      } 
    },  
    { 
     "name" : "class 2", 
     "people" : [ 
      { 
       "id" : "58456", 
       "name" : "Sissi", 
      }, 
      { 
       "id" : "45643", 
       "name" : "Susan", 
      } 
     ]  
    } 
] 
} 

Я использую PHP, и я хотел бы знать имена класса с определенным именем внутри и сохранить их в массиве.

Например, если я выбираю Сьюзен, я хотел бы иметь массив с ["class 1" , ["class 2"].

Я использовал findOne, но на этот раз мне нужно использовать find.

ответ

0

Вы можете использовать MongoDB aggregation framework.

Вот запрос, который даст вам дату в нужной форме. Тем не менее, я считаю, что будет какой-то лучший и эффективный способ справиться с этим, но это то, что я придумал.

db.collection.aggregate([ 
    {"$unwind":"$class"}, 
    {"$unwind":"$class.people"}, 
    {"$match": { 
     "class.people.name":"Susan" 
     } 
    }, 
    {"$group":{ 
     "_id":"$class.people.name", 
     "classes":{"$push":"$class.name"} 
    } 
    } 
]) 

Результат: -

{ "_id" : "Susan", "classes" : [ "class 1", "class 2" ] } 

Попробуйте $match перед первым $unwind операции, чтобы избежать ненужных результатов в трубопроводе перед тем $unwind.

См. Aggregation Pipeline Optimization для улучшения характеристик.

+0

спасибо. Оно работает. Огромное спасибо . Вы мне очень помогли. Еще раз спасибо – AlleBo