MongoDB中的Mongoose虚拟机聚合
我的mongoose纲要如下:
var DSchema = new mongoose.Schema({ original_y: {type: Number},, new_y: {type: Number},, date: {type: Date}, dummy: [dummyEmbeddedDocuments] }, toObject: { virtuals: true }, toJSON: { virtuals: true} }); DSchema.virtual('dateformatted').get(function () { return moment(this.date).format('YYYY-MM-DD HH:mm:ss'); }); module.exports = mongoose.model('D', DSchema);
我的模式中的文档将是以下内容:
{ id:1, original_y: 200, new_y: 140, date: 2015-05-03 00:00:00.000-18:30, dummy: [ {id:1, storage:2, cost: 10}, {id:2, storage:0, cost: 20}, {id:3, storage:5, cost: 30}, ] }
我的查询:
Item.aggregate([ { "$match": { "dummy.storage": {"$gt": 0} } }, { "$unwind": "$dummy" }, { "$project": { "original_y": 1, "new_y": 1, "dateformatted": 1, "dummy.id": "$dummy.id", "dummy.storage": "$dummy.storage", "dummy.cost": "$dummy.cost", "dummy.tallyAmount": { "$divide": [ { "$add": ["$new_y","$original_y"] }, "$dummy.cost" ] } } }, { "$group": { "_id": "_$id", "original_y": { "$first": "$original_y" }, "dateformatted": { "$first": "$dateformatted" }, "new_y": { "$first": "$new_y" }, "dummy": { "$addToSet": "$dummy" } } } ]).exec(callback);
但是,此查询返回VIRTUAL dateformatted属性为NULL。 任何想法,为什么发生这种情况?
文档中的一些注释涉及为什么如此:
- 参数不会转换为模型的模式,因为
$project
运算符允许在stream水线的任何阶段重新定义文档的“形状”,这可能会使文档保持不兼容的格式。- 返回的文档是纯javascript对象,而不是mongoose文档(因为可以返回任何形状的文档)。
但是它超越了这一点,因为aggregate
操作是在服务器端执行的,在这里任何客户端Mongoose概念(如虚拟)都不存在。
其结果是,您需要在$project
和$group
阶段中包含date
字段,并根据date
值将您自己的datedateformatted
字段添加到代码结果中。