Узел - Mongoose 3.6 - Сортировать запрос с заполненным полем

Я пытаюсь сделать запрос, используемый удаленной сеткой, поэтому мне придется обрабатывать сортировку (asc, desc) по всем полям.

Вот схемы:

var customerSchema = new mongoose.Schema({
status: {type: mongoose.Schema.Types.ObjectId, ref: 'Status'},
contact: {type: mongoose.Schema.Types.ObjectId, ref: 'Contact'}
}, { collection: 'Customer' });

customerSchema.virtual('contactName').get(function () {
   if (this.contact && this.contact.get) {
       return this.contact.get('firstName') + ' ' + this.contact.get('lastName');
   }

   return '';
});

customerSchema.virtual('statusName').get(function () {
   if (this.status && this.status.get) {
       return this.status.get('name');
   }

   return '';
});

customerSchema.set('toJSON', { virtuals: true });
customerSchema.set('toObject', { virtuals: true });
mongoose.model('Customer', customerSchema);

// STATUS
var statusSchema = new mongoose.Schema({}, { collection: 'Status' });
mongoose.model('Status', statusSchema);

// CONTACT
var contactSchema = new mongoose.Schema({
    firstName: String,
    lastName: String
}, { collection: 'Contact' });
mongoose.model('Contact', contactSchema);

И вот запрос:

exports.customerList = function (predicate ,callback){
if (!predicate) predicate = 'name';
var Customers = mongoose.model( 'Customer' );

Customers.find()
    .select('name phone address status contact contactName statusName')
    .populate('status', 'name')
    .populate('contact', 'firstName lastName')
    .sort(predicate)
    .exec(callback);
};

Запрос работает при сортировке по «name» (например, Customer.name) или «address» (Customer.address), но не может заставить его работать, когда он «contact.firstName» (должен быть Customer.contact.firstName).

Четвертый параметр функции заполнения - это объект опции, который может иметь объект сортировки, но делает это:

.populate('contact', 'firstName lastName', null, { sort {'firstName': 1}})

не работает (кажется, сортировать список контактов на клиента).

Я совершенно новичок в мангусте (и монго). Я пытаюсь перенести проект рельсы на узел / экспресс.

Есть ли способ, которым я могу отсортировать мой запрос по contact.firstName?

Спасибо!

Редактировать: я закончил делать сортировку вручную (Array.sort), но мне действительно не нравится это решение. Сортировка синхронизирована, поэтому она блокирует основной поток node.js (поправьте меня, если я ошибаюсь).

Есть что-то, чего я не понимаю? Сортировка набора данных - для меня проблема с базой данных, а не с приложением ... У меня была большая надежда на превращение моего приложения rails в node.js, но кажется, что некоторые стандартные операции (разбивка по сетке) действительно сложно реализовать!

Ответы на вопрос(1)

Решение Вопроса

так как эти поля присутствуют только в объектах вашего приложения (экземпляры модели Mongoose), но сортировка выполняется в MongoDB.

Это одно из ключевых ограничений, которое возникает из-за того, что MongoDB не поддерживает объединения. Если ваши данные сильно реляционные, вам следует рассмотреть возможность использования реляционной базы данных вместо MongoDB.

 JohnnyHK21 окт. 2013 г., 15:15
@Doum Правильно, или сортируй это в своем собственном коде, как ты. Я не использовал MySQL с node.js, но, возможно, начатьВот.
 Doum21 окт. 2013 г., 14:45
Таким образом, единственный способ сделать это в стиле монго, это поместить мой контакт в коллекцию клиентов (Customer.contact = {})? Является ли node.js и, например, mySql хорошей интеграцией? Есть ли хорошая форма, чтобы справиться с этим?
 Doum21 окт. 2013 г., 15:48
Возможно, я слишком привык работать с реляционной БД ... Если я решу встроить контакт в клиента (customer.contact = {}), есть ли способ получить все контакты позже без необходимости выбирать всех клиентов? В этом нет проблемы с производительностью? Например, у клиентов будет список проектов, если я встраиваю их (customer.projetcs = []) и хочу перечислить все проекты в моем приложении, мне нужно будет сделать как Customer.find () и выбрать каждого клиента просто чтобы получить список своих проектов ...

Ваш ответ на вопрос