我想基于两个文档字段的比较来定义MongoDB partialFilterExpression。具体来说,它是关于比较两个日期字段。仅当一个日期(此处为 processingTime )大于另一日期(此处为 creationTime )时,索引才有效。
我以以下方式尝试了此操作,但似乎不起作用(因为无法通过TTL索引条件删除文档)。
db.
getSiblingDB('foo').
getCollection('bar').
createIndex(
{ creationTime: 1 },
{
expireAfterSeconds: 60,
partialFilterExpression: {
processingTime: { $exists: true },
processingTime: {$gt: "$creationTime"}
}
}
);
我猜想$creationTime
不会被评估为文档字段,而只会被评估为简单文本。
有没有办法实现我的目标?
答案 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的运算符。