MongoDB Aggregate 中的 Mongoose Virtuals [英] Mongoose Virtuals in MongoDB Aggregate
问题描述
我的 Mongoose Schema 如下:
My Mongoose Schema is as follows:
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);
我的架构中的文档如下:
A document in my schema would be the following:
{
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 日期格式属性返回为 NULL.关于为什么会发生这种情况的任何想法?
This query however returns the VIRTUAL dateformatted attribute as NULL. Any thoughts as to why this is happening?
推荐答案
文档谈到了为什么会这样:
- 参数不会转换为模型的架构,因为
$project
运算符允许在任何阶段重新定义文档的形状"管道,这可能会使文档格式不兼容. - 返回的文档是纯 javascript 对象,而不是 mongoose 文档(因为可以返回任何形状的文档).
- Arguments are not cast to the model's schema because
$project
operators allow redefining the "shape" of the documents at any stage of the pipeline, which may leave documents in an incompatible format.- The documents returned are plain javascript objects, not mongoose documents (since any shape of document can be returned).
但它超出了这一点,因为 aggregate
操作是在服务器端执行的,在服务器端不存在任何客户端 Mongoose 概念,如虚拟.
But it goes beyond this because the aggregate
operation is performed server-side, where any client-side Mongoose concepts like virtuals do not exist.
结果是您需要在 $project
和 $group
阶段中包含 date
字段并添加您自己的 dateformatted
字段根据 date
值生成代码.
The result is that you'll need to include the date
field in your $project
and $group
stages and add your own dateformatted
field to the results in code based on the date
values.
这篇关于MongoDB Aggregate 中的 Mongoose Virtuals的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!