gpt4 book ai didi

具有文档字段比较的 MongoDB partialFilterExpression

转载 作者:可可西里 更新时间:2023-11-01 10:37:36 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

尝试在包含两个日期字段之间差异的每个文档中存储一个字段(例如 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”引用字段是 typically used in aggregations .在聚合之外,您需要使用 $expr operator这不是可用于 partialFilterExpression 的运算符.

关于具有文档字段比较的 MongoDB partialFilterExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54075876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com