Node.js 使用mongoose在mongodb中执行聚合时,返回一个空对象,这是为什么?

Node.js 使用mongoose在mongodb中执行聚合时,返回一个空对象,这是为什么?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,这是我第一次看到node.js和mongodb,所以我可能做了一些愚蠢的事情或错过了一些明显的事情,但是考虑到下面的文档和查询,为什么可能会返回一个空对象 1文档示例 2问题代码 确保您的模型引用了正确的集合,并且您传递的$group在$project之前。下面是一个完整的示例: var db = mongoose.createConnection('localhost:27017/myDatabase'); var expenseSchema = new mongoose.Schema({

这是我第一次看到node.js和mongodb,所以我可能做了一些愚蠢的事情或错过了一些明显的事情,但是考虑到下面的文档和查询,为什么可能会返回一个空对象

1文档示例 2问题代码
确保您的模型引用了正确的集合,并且您传递的
$group
$project
之前。下面是一个完整的示例:

var db = mongoose.createConnection('localhost:27017/myDatabase');

var expenseSchema = new mongoose.Schema({
    description: { type: String, required: true },  
    amount: { type: Number, required: true },  
    created: { type: Date, default: Date.now },
    updated: { type: Date, default: Date.now },
    categoryId: { type: Number, required: true },
    typeId: { type: Number, required: true }
});

var Expense = db.model('expenses', expenseSchema); // make sure the first argument matches your collection's name

Expense.aggregate(  
    { $group: { _id: '$typeId', expense: { $sum: '$amount' }}}, // 'group' goes first!
    { $project: { _id: 1, expense: 1 }}, // you can only project fields from 'group'
    function(err, summary) {
        console.log(summary);
    }
);
这将为您提供一个基于“typeId”汇总所有费用的输出:


我刚刚学习了聚合来回答这个问题,所以如果有什么问题,请告诉我。

将集合的名称更改为“从费用”中的“费用”解决了问题。

当我尝试时,效果很好。结果是更新了
[{u id:1,expense:452.23}]
问题,以包含mongoose模型定义。嗯……在这里,当我使用您的模式时,仍然可以正常工作。当你在壳里试的时候它能用吗?现在这很烦人。我的收藏被命名为费用,改变这个it费用和痛苦的一切开始工作!这里使用的是约定而非配置,我想这是学习曲线的一部分。实际上,在这两种情况下,都不需要
$project
,因为它不会改变
$group
自身生成的内容。作为回应,我删除了$group,结果相同。我还更新了问题,以包含更多有问题的代码。您只删除了$project而不是$group,对吗?还有,你得到了什么?您是否在
err
中收到错误,或者
summary
只是一个空对象?尝试放置
console.log(参数)在回调中查看发生了什么。另外,不要执行
mongoose.model('Expense',Expense)do<代码>数据库模型('费用',费用)
(其中
db
是您的mongoose连接。)
mongoose.model()
不会返回任何内容,我很确定。很高兴听到这个消息!如果需要,还有第三个参数用于
db.model()
,您可以在其中显式命名希望模型使用的集合(例如
db.model('modelName',myModel,'collectionName');
var Schema = mongoose.Schema;  

var Expense = new Schema({  
    description: { type: String, required: true },  
    amount: { type: Number, required: true },  
    created: { type: Date, default: Date.now },
    updated: { type: Date, default: Date.now },
    categoryId: { type: Number, required: true },
    typeId: { type: Number, required: true }
});

var ExpenseModel = mongoose.model('Expense', Expense);

ExpenseModel.aggregate(  
    { $group: { _id: '$typeId', total: { $sum: '$amount' }}}, 
    function (err, summary) {
        if(err){
            return res.send(500, { error: err }); 
        }

        if(summary) {
            return res.send(summary);
        } else {
            res.send(500, { error: 'couldnt find expenses' }); 
        }
    }
);
var db = mongoose.createConnection('localhost:27017/myDatabase');

var expenseSchema = new mongoose.Schema({
    description: { type: String, required: true },  
    amount: { type: Number, required: true },  
    created: { type: Date, default: Date.now },
    updated: { type: Date, default: Date.now },
    categoryId: { type: Number, required: true },
    typeId: { type: Number, required: true }
});

var Expense = db.model('expenses', expenseSchema); // make sure the first argument matches your collection's name

Expense.aggregate(  
    { $group: { _id: '$typeId', expense: { $sum: '$amount' }}}, // 'group' goes first!
    { $project: { _id: 1, expense: 1 }}, // you can only project fields from 'group'
    function(err, summary) {
        console.log(summary);
    }
);
[
    { _id: 1, expense: 300.00 },
    { _id: 2, expense: 45.00 },
    ...
]