2016-09-07 2 views
2

In MongoDB Есть документы в следующей структуре:MongoDB размотать несколько массивов

{ 
    "_id" : ObjectId("52d017d4b60fb046cdaf4851"), 
    "dates" : [ 
     1399518702000, 
     1399126333000, 
     1399209192000, 
     1399027545000 
    ], 
    "dress_number" : "4", 
    "name" : "J. Evans", 
    "numbers" : [ 
     "5982", 
     "5983", 
     "5984", 
     "5985" 
    ] 
} 

это возможно Отмотать данные из нескольких массивов и получить только парные элементы из массивов:

{ 
    "dates": "1399518702000", 
    "numbers": "5982" 
}, 
{ 
    "dates": "1399126333000", 
    "numbers": "5983" 
}, 
{ 
    "dates": "1399209192000", 
    "numbers": "5984" 
}, 
{ 
    "dates": "1399027545000", 
    "numbers": "5985" 
} 
+0

Что произойдет, если длина массива 'date' и длина массива' numbers' не одинаковы? – Yogesh

+0

Они всегда имеют одинаковую длину. – corry

+0

Элемент массива 'date' - это строка' '[1399518702000, 1399126333000, 1399209192000, 1399027545000]" ', а не массив. – chridam

ответ

5

Начиная с версии 3.2 вы можете сделать это с $unwind на обоих массивах, $cmp индексов, и $match только равные индексы.

В этом решении будет заполнено то, что вы написали, если у вас есть только пример документа. Если у вас есть больше документов, я не знаю, что вы ожидаете получить на выходе, но оно разрешимо путем группировки _id документа.

db.test.aggregate([ 
    { 
     $unwind: { 
      path: '$dates', 
      includeArrayIndex: 'dates_index', 
     } 
    }, 
    { 
     $unwind: { 
      path: '$numbers', 
      includeArrayIndex: 'numbers_index', 
     } 
    }, 
    { 
     $project: { 
      dates: 1, 
      numbers: 1, 
      compare: { 
       $cmp: ['$dates_index', '$numbers_index'] 
      } 
     } 
    }, 
    { 
     $match: { 
      compare: 0 
     } 
    }, 
    { 
     $project: { 
      _id: 0, 
      dates: 1, 
      numbers: 1 
     } 
    } 
]) 
+0

Если бы я хорошо понял, можно развернуть максимум два массива? – corry

+0

@corry, как вы это поняли? вы можете расслабиться столько, сколько захотите. Проблема состоит в том, что каждый элемент станет документом, поэтому для многих раскручивается результат будет огромным db. с ними будет очень сложно справиться, и они спрашивают, что вы хотите с ними делать. – TomG

+0

Я думаю, что невозможно было бы раскрутить столько, сколько захочу, из-за оператора $ cmp. Я задал новый вопрос относительно этой проблемы. Http://stackoverflow.com/questions/39426022/mongodb-show-children-items-in-one-to-many-relationship – corry

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