【问题标题】:Mongoose: Remove elements from array of objects in Mongo if condition is metMongoose:如果满足条件,则从 Mongo 中的对象数组中删除元素
【发布时间】:2019-06-04 13:37:12
【问题描述】:

我有一个对象数组,用于存储 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

如果有办法在对象数组中设置整数的最大值,并在插入新条目时自动弹出最旧的条目,这也适用于我。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    根据您的架构,log 只是一个包含字段 date 的文档数组,因此如果您想为该字段构建条件,您的更新可能如下所示:

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

    【讨论】:

    • 开枪,想回答同样的问题;-)。
    • @BenSower 如果您认为这是正确的答案,您可以随时投票;)
    • 永远不会!不,开个玩笑,但是像你这样的人,像我这样的可怜的新手怎么会一开始就得到他们甜蜜的支持呢? :-P
    • 这非常接近,除了它删除了日志中的每个条目。不仅仅是超过五天的事情。
    • @AndrewTaylor $gte 将删除五天前的更新,所以你需要$lte
    猜你喜欢
    • 2015-10-13
    • 2014-05-22
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多