MongoDB PartialFilterExpression与文档字段进行比较

时间:2019-01-07 14:02:34

标签: mongodb

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

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

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

我猜想$creationTime不会被评估为文档字段,而只会被评估为简单文本。

有没有办法实现我的目标?

1 个答案:

答案 0 :(得分: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的运算符。