2014-10-09 2 views
0

Мне нужно получить конкретный объект в массиве массива в MongoDB.Получить конкретный объект в массиве массива в MongoDB

Мне нужен только объект задачи = [_id = ObjectId ("543429a2cb38b1d83c3ff2c2")].

Мой документ (проекты):

{ 
    "_id" : ObjectId("543428c2cb38b1d83c3ff2bd"), 
    "name" : "new project", 
    "author" : ObjectId("5424ac37eb0ea85d4c921f8b"), 
    "members" : [ 
     ObjectId("5424ac37eb0ea85d4c921f8b") 
    ], 
    "US" : [ 
     { 
      "_id" : ObjectId("5434297fcb38b1d83c3ff2c0"), 
      "name" : "Test Story", 
      "author" : ObjectId("5424ac37eb0ea85d4c921f8b"), 
      "tasks" : [ 
       { 
        "_id" : ObjectId("54342987cb38b1d83c3ff2c1"), 
        "name" : "teste3", 
        "author" : ObjectId("5424ac37eb0ea85d4c921f8b") 
       }, 
       { 
        "_id" : ObjectId("543429a2cb38b1d83c3ff2c2"), 
        "name" : "jklasdfa_XXX", 
        "author" : ObjectId("5424ac37eb0ea85d4c921f8b") 
       } 
      ] 
     } 
    ] 
} 

Результат ожидается:

{ 
    "_id" : ObjectId("543429a2cb38b1d83c3ff2c2"), 
    "name" : "jklasdfa_XXX", 
    "author" : ObjectId("5424ac37eb0ea85d4c921f8b") 
} 

Но я не получаю его. я до сих пор тестирование без успеха:

db.projects.find({   
     "US.tasks._id" : ObjectId("543429a2cb38b1d83c3ff2c2")   
    }, { "US.tasks.$" : 1 }) 

I судимого с $ elemMatch тоже, но не возвращаю ничего.

db.projects.find({  
     "US" : { 
      "tasks" : { 
       $elemMatch : { 
        "_id" : ObjectId("543429a2cb38b1d83c3ff2c2")       
       }    
      } 
     }  
}) 

Могу ли я получить ТОЛЬКО мой ожидаемый результат, используя find()? Если нет, что и как использовать?

Спасибо!

ответ

0

Вам потребуется aggregatio п для этого:

db.projects.aggregate([{$unwind:"$US"}, 
         {$unwind:"$US.tasks"}, 
         {$match:{"US.tasks._id":ObjectId("543429a2cb38b1d83c3ff2c2")}}, 
         {$project:{_id:0,"task":"$US.tasks"}}]) 

должен вернуть

{ task : { 
    "_id" : ObjectId("543429a2cb38b1d83c3ff2c2"), 
    "name" : "jklasdfa_XXX", 
    "author" : ObjectId("5424ac37eb0ea85d4c921f8b") 
} 

Объяснение:

  • $unwind создает новый (виртуальный) документ для каждого элемента массива
  • $match является частью запроса вашей находки
  • $project похож, чтобы проецировать часть в находке т.е. определяет поля, которые вы хотите получить в результатах

Вы можете добавить второй $match перед $unwind если вы знаете документ, который вы ищете (посмотрите на показатели производительности).


Редактирование: добавлен второй $unwind, поскольку US является массивом.

Не знаете, что вы делаете (так реально не можете сказать и просто прикрыть), но вы можете проверить, идеально ли подходит ваша схема (и mongodb) для вашей задачи, потому что документ выглядит так же, как денормализованные реляционные данные вероятно, реляционная база данных будет лучше для вас.

+0

Удивительное объяснение и советы! Благодаря! – GabrielBiga

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