2015-10-01 2 views
1

в MongoDB, у меня есть много документов в массиве 2 уровня, как показано ниже:запроса массив 2 уровня в MongoDB

{ 
_id:1, 
"toPerson": [ 
     [ 
      { 
       "userid": "test1" 
      }, 
      { 
       "userid": "test2" 
      } 
     ], 
     [ 
      { 
       "userid": "test10" 
      }, 
      { 
       "userid": "test11" 
      } 
     ] 
    ] 
} 
..... 
{ 
_id:99, 
"toPerson": [ 
     [ 
      { 
       "userid": "test2" 
      }, 
      { 
       "userid": "test3" 
      } 
     ], 
     [ 
      { 
       "userid": "test100" 
      }, 
      { 
       "userid": "test101" 
      } 
     ] 
    ] 
} 

Вопрос в том, как запросить все документы, которые говорят test2 идентификатор пользователь?

Пытались:

col.find({'toPerson.userid':'test2'})

это не возвращают ничего. также я пробовал использовать aggregate, но нашел, возможно, это не правильное направление.

Любой может помочь с этим?


UPDATE 1 Просто прочитал этот пост

Retrieve only the queried element in an object array in MongoDB collection

но отличается

  1. Структура ди fferent: is {field:[ [{ }], [{ }], .... ]}, а не { field:[ {}, {} ] }
  2. Я хочу, чтобы все возвращенные структуры документов были нетронутыми, $ unwind (make toPerson будет 1-уровневым массивом) или $$ PRUNE (удалить некоторые поля) изменит возвращаемую структуру.


UPDATE 2

То, что я хочу, чтобы получить следующий результат в одной инструкции:

col.find({ 'toPerson.0.userid':'test2' }) + col.find({ 'toPerson.1.userid':'test2' }) + ... ...

Есть ли точная копия заявление выше результатов объединены вместе?

+0

Ну, у вас есть запрос, но если вы ожидаете вернуть только те элементы, которые соответствуют массиву, то '.aggregate()' является вашим единственным направлением. Посмотрите документацию для [positional '$' operator] (http://docs.mongodb.org/manual/reference/operator/projection/positional/). Вложенные массивы не будут работать, поскольку только позиция «первый» или «внешний» массив соответствует возвращенной позиции. –

+1

Возможный дубликат [Получить только запрошенный элемент в массиве объектов в коллекции MongoDB] (http: // stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array-in-mongodb-collection) –

+0

@BlakesSeven Я попробовал снова, запрос не работает, потому что это '{поле: [[{}], [{}], ....]} 'структура, а не' {поле: [{}, {}]} ',' $ elemMatch' также не решает. –

ответ

2

Вы можете запросить вложенные массивы, как этого с использованием двух уровней $elemMatch:

db.test.find({toPerson: {$elemMatch: {$elemMatch: {userid: 'test2'}}}}) 

Наружный $elemMatch говорит соответствует элемент массива из toPerson где значение проходит внутренний массив $elemMatch тест элемента, соответствующего {userid: 'test'}.

+0

Просто попробовал, он сработал! Но еще один вопрос: если какое-то поле toPerson является 1-уровневым массивом, скажите: '{_id: 3, toPerson: [{userid: 'test2'}]}', это единственный способ получить как 1-уровневый, так и 2 -уровневые документы, содержащие 'test2'? 'col.find ({$ или: [{'toPerson.userid': 'test2'}, {'toPerson': {$ elemMatch: {$ elemMatch: {'userid': 'test2'}}}}]}) ' –

+0

@JamesYang Я бы так сказал, да. – JohnnyHK

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