我有一个父子模式,如下所示:
schedule = Schema ({
from: Date,
to: Date
});
content = Schema ({
schedule: { type: Schema.ObjectId, ref: "schedule" }
name: String
});
我的问题是,如何查询Mongoose以返回“所有内容,按日期排序?从日期开始”?
答案 0 :(得分: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
架构中排序/滤波)。
答案 1 :(得分:-1)
在您的情况下,您只需存储schedule.from
& schedule.to
。
请尝试以下方法:
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);
});
何时参考其他馆藏中的文件?
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
<小时/>