MongoDB partialFilterExpression与文档字段比较

3

我想定义一个基于两个文档字段比较的MongoDB partialFilterExpression,具体而言是比较两个日期字段。如果其中一个日期(此处为processingTime)大于另一个日期(此处为creationTime),则该索引应仅在此时有效。

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

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

我猜 $creationTime 被认为是一个简单的文本,而不是一个文档字段。是否有一种方法可以实现我的目标?
1个回答

2
尝试在每个文档中存储一个字段,该字段包含两个日期字段之间的差异(例如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大于字符串"$compare_field",这与具有值$this_returns的文档相匹配。
使用“$fieldname”引用字段通常在聚合中使用。在聚合之外,您需要使用$expr operator,它不是可以用于partialFilterExpression的运算符。

谢谢,特别是关于diff字段的解决方法。;-) - FrVaBe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接