尝试与集合关系聚合时出现 MongoError

Posted

技术标签:

【中文标题】尝试与集合关系聚合时出现 MongoError【英文标题】:MongoError when trying to aggregate with collection relationship 【发布时间】:2016-06-15 23:58:54 【问题描述】:

我是 mongodb 的新手,使用 meanjs.org 的平均堆栈。

我有一个具有用户集合关系的模型:

var MealSchema = new Schema(
  mealDate: 
    type: Date,
    default: Date.now
  ,
  user: 
    type: Schema.ObjectId,
    ref: 'User'
  
);
mongoose.model('Meal', MealSchema);

我找到了一个可行的实现:

var user = req.user;
Meal.find(
  mealDate: 
    $gte: minus8days.toDate(),
    $lt: tomorrow.toDate()
  ,
  user : user
  ).exec(function (err, meals) 
  if (err) 
    return res.status(400).send(
      message: errorHandler.getErrorMessage(err)
    );
   else 
    res.json(meals);
  
);

但是我需要一些分组和聚合,所以我试图更改此代码以使用聚合而不是查找,我尝试了很多组合并且我不断收到错误,基本上以下实现会引发错误 MongoError: Maximum call超出堆栈大小

Meal.aggregate([

  $match: 
    $and: [
      
        mealDate: 
          $gte: minus8days.toDate(),
          $lt: tomorrow.toDate()
        
      ,  user: user 
    ]
  
]...

为什么 user:user 使用 find 而不是聚合? 如何修复聚合方法?

【问题讨论】:

请尝试 $match: mealDate: $gte: minus8days.toDate(), $lt: tomorrow.toDate() , user: user 并在aggregation 末尾添加function(err),它可以为您提供更多有关错误的信息? user的值是否正确ObjectId 您给出的建议基本上是删除 $and 和数组括号不起作用,它给出了相同的错误(超出了最大调用堆栈)。用户的价值是正确的,正如我所提到的,它在 find 中的使用与此完全一样,并且可以正常工作。建议的函数错误已经存在,我只是省略了,因为它对问题没有太大影响。感谢您的帮助。 【参考方案1】:

试试这个:

Meal.aggregate([
     
       $match:  
           mealDate:  $gte: minus8days.toDate(), $lt: tomorrow.toDate(),
           user: user._id
       
    
], function(err, docs)
    if(err) console.log("Error : " + JSON.stringify(err));
    if(docs) console.log("Got the docs successfully : " + JSON.stringify(docs));
);

【讨论】:

嗨,这可行,但我现在很困惑。 user:user 用于查找但不适用于聚合的原因是什么?有任何想法吗?谢谢

以上是关于尝试与集合关系聚合时出现 MongoError的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoose、gridfs-stream 和 multer 上传文件时出现 MongoError

Unhashable 类型:尝试在 Django 中使用 post_save 动态添加 m2m 关系时出现“列表”错误

尝试创建多对多关系时出现 MySQL 错误

mongoDB表与表的关系及聚合管道查询

在 SQL 数据建模器中将逻辑模型转换为关系模型时出现问题

尝试在 Django 中的模型表之间建立关系。但是在插入值时出现错误 |外键项必须是一个实例