2016-02-26 2 views
0

У меня есть вложенный документ следующего формата:вложенная документ чтения в MongoDB массиве в узле

{ 
    _id: "1234567890", 
    course: {content: [{ id: 1, 
          children:[{ 
          id: 1111 
          }, 
          { 
          id: 2222 
          } 
           { 
          id: 3333 
          }] 
         }, 
         { id: 2, 
          children:[{ 
          id: 4444 
          }, 
          { 
          id: 5555 
          } 
           { 
          id: 6666 
          }] 
         } 

       ]} 

} 

Я пытаюсь запросить детей на основе идентификатора (course.content.children.id) с использованием следующих код из Node.js:

var query = { 
      'course.content.children.id': quizId, 
}; 
var option = { 
     'course.content.children.$': 1, 
     }; 
db.getEntityWithOption(tablename,query,option,function(data,err){ 
    res.send(data.course.content[0].children); 
}); 

db.getEntityWithOption является методом обертки поверх db.find методы(). когда я вызываю метод с идентификатором викторины 1, приведенный выше код возврата мне следующий полный массив: `

      { id: 1, 
          children:[{ 
          id: 1111 
          }, 
          { 
          id: 2222 
          } 
           { 
          id: 3333 
          }] 
         } 

Но мне нужен только конкретный элемент массива с идентификатором 1111 а не массив соперничают. Может ли любой спаситель жизни сказать мне, что я делаю неправильно здесь. ТИА :)

+0

возможно duplidate из http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an -объект-массив-in-mongodb-collection – Ben

+0

@Ben Я уже прошел через ссылку, она не работает для меня, и возвращает мне полный набор массивов, как упоминалось. –

ответ

0

Ну вы можете найти идентификатор, что вы хотите от детей объект затем отправить результат как:

res.send(data.course.content[0].children[0]); 

Или вы можете найти его с цикл, если его не в первый элемент массива затем отправил результат.

Или вы можете попробовать использовать $ elemMatch в своем запросе, но тогда вам придется использовать агрегацию.

Кстати, на мой взгляд, вы не должны использовать так глубоко вложенные документы, потому что будет сложно запускать сложные запросы.

0

Пожалуйста, попробуйте через aggregation, с $unwind и $match

> db.course.aggregate([ 
         // unwind the `content` array 
         {$unwind: '$course.content'}, 
         // unwind the `children` array of `content` 
         {$unwind: '$course.content.children'}, 
         // match the id with `1111` 
         {$match: {'course.content.children.id': 1111}}]); 

Результат:

{ "_id" : ObjectId("56d058d22750efa1f9dc3772"), "course" : { "content" : { "id" : 1, "children" : { "id" : 1111 } } } } 

Чтобы встретить вас требование, возвращается только 1111 массив, мы можем сделать это через $project

> db.course.aggregate([{$unwind: '$course.content'}, 
         {$unwind: '$course.content.children'}, 
         {$match: {'course.content.children.id': 111}}, 
         {$project: {_id: 0, arr: '$course.content.children'}}]); 

Результата:

{ "arr" : { "id" : 111 } } 
-1

Вы хотите запросить по свойству, но вы не знаете, какой ребенок из content и children массивов обладают запрашиваемым идентификатором. MongoDB обеспечивает positional operator

запрос должен быть определен следующим образом:

var query = { 
    'course.content.$.children.$.id': quizId, 
}; 
Смежные вопросы