猫鼬:如果满足条件,则从Mongo中的对象数组中删除元素

时间:2019-01-09 17:59:20

标签: javascript node.js mongodb mongoose

我有一个对象数组,用于存储API请求的日期以及请求和响应的JSON值。问题是我不希望该日志变大。我需要设置最大限制或删除早于特定日期的条目。

当该对象的日期值大于5天时,我试图使用mongo / mongoose查询删除数组中的元素。

这是mongo模型的相关部分:


      log: [
        {
          select: false,
          date: {
            type: Date,
            default: Date.now,
            select: false
          },
          request: { type: String, select: false },
          response: { type: String, select: false }
        }
      ]

我尝试使用updateMany和$ pull


    const fiveDaysAgo = moment()
      .subtract(5, 'day')
      .format('YYYY-MM-DD');

    // Ensure log value exists in collection
    // Remove any log entry older than five days
    Collection.updateMany(
      { log: { $exists: true } },
      { $pull: { 'log.$[].date': { $gte: fiveDaysAgo } } }
    ).then(data => console.log(data));

这会产生此错误:

(node:1957) UnhandledPromiseRejectionWarning: MongoError: Cannot apply $pull to a non-array value

如果有一种方法可以在对象数组中设置最大值,并在插入新条目时自动弹出最旧的条目,这对我也同样适用。

1 个答案:

答案 0 :(得分:2)

基于模式log只是一个包含字段date的文档数组,因此,如果您要为该字段建立条件,则更新如下所示:

Collection.updateMany(
    { log: { $exists: true } },
    { $pull: { 'log': { date: { $lte: fiveDaysAgo } } } }
    ).then(...)