2013-02-17 2 views
0

Итак, у меня есть две модели мангуста:Сортировка по длине массива, если он не заполнен в модели

User: { 
    name: String, 
    .......... 
    locations: [] 
} 

Location: { 
    title: String, 
    ............. 
    owner: { 
     type: Schema.Types.ObjectId, 
     ref: 'User' 
    } 
} 

моих подстановки функция в узле, для пользователя это что-то вроде:

api.find = function(filter, sort, skip, limit){ 
    var callback = arguments[arguments.length - 1]; 
    filter = treatFilter(filter); 
    sort = treatSort(sort); 
    if(callback && typeof callback === 'function'){ 
     User.find(filter).sort(sort).skip(skip).limit(limit).exec(function(err, users){ 
      if(users.length === 0){ 
       callback(err, users); 
      } 
      for(var i = 0, complete = 0; i < users.length; i++){ 
       (function(idx){ 
        var user = users[idx]; 
        var id = user.id; 
        Location.find({owner: id}, function(err, locations){ 
         user.locations = locations; 
         if(++complete === users.length){ 
          callback(err, users); 
         } 
        }); 
       })(i); 
      } 
     }); 
    } 
}; 

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

Спасибо, если у вас есть какие-либо сомнения, я буду рад объяснить свой код

ответ

2

Согласно этому сообщению (mongoose - sort by array length)

Вы должны поддерживать отдельное поле, которое хранит количество местоположения - не слишком много накладных расходов, но немного раздражает, чтобы поддерживать

Я смотрел на сортировку по виртуальному полю, но это тоже невозможно, и, вероятно, было бы весьма неэффективно ...

+0

хмм, спасибо. Я думал об этом, но это waaaay, чтобы раздражать mantain. Я приму ваш ответ, если ничего не получится –

+2

Нет лучшего способа. Поскольку вы используете mongoose, вы можете просто пересчитать массив до сохранения с помощью промежуточного программного обеспечения. На самом деле это неважно. –

+0

Это хорошая идея. Я попробую –

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