2015-01-20 2 views
0

Я имею в виду 2 коллекции, профиль и подписчиков. Профили содержат информацию о ..profile (характеристики, идентификатор фотографии и т. Д.), А последователи содержат ссылку на профиль _ID. Я прикрепил образец этого 2 сборочный комплект. Мы видим, что в следящей коллекции последние последователи bob (_id 1) равны 4,2,3 соответственно принц, джон, алиса. _id 3 является alice, и это последний вставленный.Простой узор, сортировать по прошедшим подпискам

Мне нужно отобразить всю информацию о профилях (содержать в коллекции профилей) всех последних последователей боба в логическом порядке «новый до старости». Я предполагаю, что ему нужны 2 запроса, но даже я не нашел решение/функцию для этого, возможно ли это? Если вы знаете, если это невозможно в двух запросах, я полностью открыт для других шаблонов.

Для приведенного выше примера, результат, ожидаемый (обратите внимание на порядок 3, 2, 4) должно быть:

{ 
    "_id" : 3, 
    "name" : "alice", 
    "Region1" : "Alsace", 
    "code_postal" : 67240, 
    "ville" : "Oberhoffen-sur-Moder", 
    "photo_id" : 7800098 

} 

{ 
    "_id" : 2, 
    "name" : "jhon", 
    "Region1" : "Alsace", 
    "code_postal" : 67240, 
    "ville" : "Oberhoffen-sur-Moder", 
    "photo_id" : 7111987  
} 

{ 
    "_id" : 4, 
    "name" : "prince", 
    "Region1" : "Alsace", 
    "code_postal" : 67240, 
    "ville" : "Oberhoffen-sur-Moder", 
    "photo_id" : 6535098 

} 

коллекция профиль образца:

db.profile.find() 
{ 
    "_id" : 1, 
    "name" : "bob", 
    "Region1" : "Alsace", 
    "code_postal" : 67240, 
    "ville" : "Oberhoffen-sur-Moder", 
    "photo_id" : 7863635 

} 

{ 
    "_id" : 2, 
    "name" : "jhon", 
    "Region1" : "Alsace", 
    "code_postal" : 67240, 
    "ville" : "Oberhoffen-sur-Moder", 
    "photo_id" : 7111987  
} 

{ 
    "_id" : 3, 
    "name" : "alice", 
    "Region1" : "Alsace", 
    "code_postal" : 67240, 
    "ville" : "Oberhoffen-sur-Moder", 
    "photo_id" : 7800098 
} 
{ 
    "_id" : 4, 
    "name" : "prince", 
    "Region1" : "Alsace", 
    "code_postal" : 67240, 
    "ville" : "Oberhoffen-sur-Moder", 
    "photo_id" : 6535098 
} 

сбор подписей образец:

db.followers.find() 

{ 
    "_id" : 1, 
    "followers" : [4,2,3] 
} 


{ 
    "_id" : 2, 
    "followers" : [8,2,3,11,39,653,] 
} 


{ 
    "_id" : 3, 
    "followers" : [9,76,538,111,134] 
} 

ответ

1
var target = db.followers.find({_id: 1}).toArray(); 
var followers = target[0].followers.reverse(); 

Так как вам нужно, чтобы сохранить порядок аргументов в followers Вам нужно будет использовать mapReduce в Нил Ланн предложил here

db.profile.mapReduce(
    function() { 
     var order = inputs.indexOf(this._id); 
     emit(order, { doc: this }); 
    }, 
    function() {}, 
    { 
     "out": { "inline": 1 }, 
     "query": { "_id": { "$in": followers } }, 
     "scope": { "inputs": followers } , 
     "finalize": function (key, value) { 
      return value.doc; 
     } 
    } 
) 


{ 
     "results" : [ 
       { 
         "_id" : 0, 
         "value" : { 
           "_id" : 3, 
           "name" : "alice", 
           "Region1" : "Alsace", 
           "code_postal" : 67240, 
           "ville" : "Oberhoffen-sur-Moder", 
           "photo_id" : 7800098 
         } 
       }, 
       { 
         "_id" : 1, 
         "value" : { 
           "_id" : 2, 
           "name" : "jhon", 
           "Region1" : "Alsace", 
           "code_postal" : 67240, 
           "ville" : "Oberhoffen-sur-Moder", 
           "photo_id" : 7111987 
         } 
       }, 
       { 
         "_id" : 2, 
         "value" : { 
           "_id" : 4, 
           "name" : "prince", 
           "Region1" : "Alsace", 
           "code_postal" : 67240, 
           "ville" : "Oberhoffen-sur-Moder", 
           "photo_id" : 6535098 
         } 
       } 
     ], 
     "timeMillis" : 1, 
     "counts" : { 
       "input" : 3, 
       "emit" : 3, 
       "reduce" : 0, 
       "output" : 3 
     }, 
     "ok" : 1 
}