Mongoose按子值排序

时间:2013-11-19 03:57:58

标签: node.js mongodb mongoose

我有一个父子模式,如下所示:

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

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

我的问题是,如何查询Mongoose以返回“所有内容,按日期排序?从日期开始”?

2 个答案:

答案 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);
});

检查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

<小时/>