2013-11-19 4 views
3

У меня есть родительский и дочерний схему, которая выглядит как:Mongoose сортировка по значению детской

schedule = Schema ({ 
    from: Date, 
    to: Date 
}); 

content = Schema ({ 
    schedule: { type: Schema.ObjectId, ref: "schedule" } 
    name: String 
}); 

Мой вопрос, как я могу запросить Мангуст вернуть «все содержание, отсортированный по дате schedule.from»?

+0

Можете ли вы показать мне, как данные хранятся в MongoDB? –

ответ

0

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

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

Наиболее эффективным средством было бы хранить поля даты в модели content, чтобы вы могли выполнять сортировку непосредственно из одного документа и коллекции без необходимости соединения. Хотя это может вызвать другие проблемы с дизайном схемы, которые вы хотели бы иметь, вы можете обнаружить, что это наиболее эффективно. Преимущество этого процесса денормализации состоит в том, что вы можете выполнять сортировку, фильтрацию и т. Д. Очень легко и эффективно (особенно если вы указали поля даты, например).

schedule = Schema ({ 
    from: Date, 
    to: Date 
}; 

content = Schema ({ 
    schedule: { type: Schema.ObjectId, ref: "schedule" }, 
    schedule_data: { 
     from: Date, 
     to: Date 
    }, 
    name: String 
}); 

Вы можете оставить поле schedule в content схеме, если вы хотите, чтобы иметь возможность быстро находить и обновлять content документы (или если были другие менее используются или не нужны для сортировки/фильтрации).

+0

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

+0

Использование MongoDB требует другого способа мышления, особенно если вы привыкли к реляционным моделям. – WiredPrairie

-1

В вашем случае вам не нужна ссылка из одной коллекции в другую, просто для хранения schedule.from .
Попробуйте следующее:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
mongoose.connect('mongodb://localhost/test'); 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function callback() { 
console.log('Mongoose connected to MongoDB\n'); 
content_sch = Schema ({ 
     schedule: { 
      from: Date, 
      to: Date 
    }, 
    name: String 
}); 
var content = mongoose.model('content', content_sch); 
     contentObj = new content(); 
     contentObj.schedule.from = Date.now(); 
     contentObj.schedule.to = Date.now(); 
     contentObj.name = 'Ryan Rife'; 
     contentObj.save(); 
     //Sorting; -1 to specify an ascending or 1 descending sort respectively 
     content.find({}).sort({'schedule.from': -1}).exec(function(err,contentDocs){ 
      console.log(contentDocs); 
     }); 
}); 

Вы можете сделать сортировку по многим другим один выглядит следующим образом, который вы могли бы попробовать:

content.find({}, null, {sort: {schedule.from: -1}}, function(err, contentDocs) { 
    //console.log(contentDocs); 
}); 

Проверить this для более info


Когда обращаться за ссылками на документы в других коллекциях?

В MongoDB нет объединений, но иногда нам все еще нужны ссылки на документы в других сборниках (схема). Только тогда вам нужно использовать ObjectId, который относится к другому schema и от этого schema назад к родительскому.
Пример:

var personSchema = Schema({ 
    _id  : Number, 
    name : String, 
    age  : Number, 
    stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }] //Here is a link to child Schema 'Story' 
}); 

var storySchema = Schema({ 
    _creator : { type: Number, ref: 'Person' }, //Field which again refers to parent schema 'Person' 
    title : String, 
    fans  : [{ type: Number, ref: 'Person' }] //Array which again refers to parent schema 'Person' 
}); 

var Story = mongoose.model('Story', storySchema); 
var Person = mongoose.model('Person', personSchema); 

Для получения дополнительной информации проверить это mongoose populate docs


+1

Это не сработает, потому что 'schedule' - это просто ObjectId в' content', а не вложенный документ. – JohnnyHK

+0

@JohnnyHK: Спасибо .. Я не заметил, что 'Schema.ObjectId' Я видел только вопрос **, отсортированный по расписанию. From date ** –

+0

Это также не относится к JavaScript как написано (' {schedule.from: -1} '). – WiredPrairie

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