【问题标题】:MongoDB partialFilterExpression with document field comparissonMongoDB partialFilterExpression 与文档字段比较
【发布时间】:2019-01-07 14:02:33
【问题描述】:

我想定义一个基于两个文档字段比较的 MongoDB partialFilterExpression。具体来说,它是关于比较两个日期字段。只有当一个日期(此处为 processingTime)大于另一日期(此处为 creationTime)时,该索引才应有效。

我尝试了以下方式,但似乎不起作用(因为文档没有通过 TTL 索引条件删除)。

db.
  getSiblingDB('foo').
  getCollection('bar').
  createIndex(
    { creationTime: 1 },
    {
      expireAfterSeconds: 60,
      partialFilterExpression: {
        processingTime: { $exists: true },
        processingTime: {$gt: "$creationTime"}
      }
    }
  );

我猜$creationTime 没有被评估为文档字段,而只是作为简单的文本。

有没有办法达到我的目标?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    尝试在每个文档中存储一个包含两个日期字段之间差异的字段(例如processing_creation_time_diff),然后在该值上设置partialFilterExpression。例如:

    db.getSiblingDB('foo').
      getCollection('bar').
      createIndex(
        { creationTime: 1 },
        {
          expireAfterSeconds: 60,
          partialFilterExpression: { 
            processing_creation_time_diff : { "$gt": 0 } // processing is greater than creation
          }
        }
      )
    

    您是正确的,当前定义的索引规范将$creationTime 评估为字符串。我整理了一个简单的示例,展示了过滤器表达式将processingTime 与字符串'$creationTime' 进行比较:

    db.bar.insert({ "x" : "$before", "y" : 1 })
    db.bar.insert({ "x" : "$compare_field", "y" : 1 })
    db.bar.insert({ "x" : "$this_returns", "y" : 1  })
    
    db.getCollection('bar').createIndex(
      { y: 1 },
      {
        partialFilterExpression: {
          x: {$gt: "$compare_field"}
        }
      }
    );
    
    db.bar.find({ "x" : { "$gt" : "$compare_field" }, "y" : 1 }).explain("executionStats")
    
    // Returns only one doc using the partial index:
    { "_id" : ObjectId("5c342c9f1ed401160b81011d"), "x" : "$this_returns", "y" : 1 }
    

    部分过滤器表达式被评估为x is greater than the string "$compare_field",它与值为$this_returns 的文档匹配。

    使用“$fieldname”引用字段是typically used in aggregations。在聚合之外,您需要使用$expr operator,它不是可用于partialFilterExpression 的运算符。

    【讨论】:

    • 感谢,特别是 diff 字段的解决方法。 ;-)
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多