比较MongoDB中的两个日期字段

Raf*_*nte 10 datetime mongodb node.js mongodb-query aggregation-framework

在我的收藏中,每个文档都有2个日期,修改和同步.我想找到那些修改>同步或同步不存在的那些.

我试过了

{'modified': { $gt : 'sync' }}
Run Code Online (Sandbox Code Playgroud)

但它没有表现出我的预期.有任何想法吗?

谢谢

Der*_*ick 18

您无法将字段与另一个字段的值与普通查询匹配进行比较.但是,您可以使用聚合框架执行此操作:

db.so.aggregate( [
    { $match: …your normal other query… },
    { $match: { $eq: [ '$modified', '$sync' ] } }
] );
Run Code Online (Sandbox Code Playgroud)

我把......你正常的其他查询...放在那里,因为你可以使用该索引.因此,如果您只想为name字段所在的文档执行此操作,则charles可以执行以下操作:

db.so.ensureIndex( { name: 1 } );
db.so.aggregate( [
    { $match: { name: 'charles' } },
    { $project: { 
        modified: 1, 
        sync: 1,
        name: 1,
        eq: { $cond: [ { $gt: [ '$modified', '$sync' ] }, 1, 0 ] } 
    } },
    { $match: { eq: 1 } }
] );
Run Code Online (Sandbox Code Playgroud)

随着输入:

{ "_id" : ObjectId("520276459bf0f0f3a6e4589c"), "modified" : 73845345, "sync" : 73234 }
{ "_id" : ObjectId("5202764f9bf0f0f3a6e4589d"), "modified" : 4, "sync" : 4 }
{ "_id" : ObjectId("5202765b9bf0f0f3a6e4589e"), "modified" : 4, "sync" : 4, "name" : "charles" }
{ "_id" : ObjectId("5202765e9bf0f0f3a6e4589f"), "modified" : 4, "sync" : 45, "name" : "charles" }
{ "_id" : ObjectId("520276949bf0f0f3a6e458a1"), "modified" : 46, "sync" : 45, "name" : "charles" }
Run Code Online (Sandbox Code Playgroud)

返回:

{
    "result" : [
        {
            "_id" : ObjectId("520276949bf0f0f3a6e458a1"),
            "modified" : 46,
            "sync" : 45,
            "name" : "charles",
            "eq" : 1
        }
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

如果你想要更多的字段,你需要在中添加它们$project.

  • 您应该避免使用$ where变体,因为它会通过Javascript。另外,请接受答案。 (3认同)

chr*_*dam 9

对于 MongoDB 3.6 及更新版本:

$expr运算符允许在查询语言中使用聚合表达式,因此您可以执行以下操作:

db.test.find({ "$expr": { "$gt": ["$modified", "$sync"] } })
Run Code Online (Sandbox Code Playgroud)

或使用带有$match管道的聚合框架

db.test.aggregate([
    { "$match": { "$expr": { "$gt": ["$modified", "$sync"] } } }
])
Run Code Online (Sandbox Code Playgroud)

对于 MongoDB 3.0+:

您还可以将聚合框架与$redact管道运算符一起使用,它允许您$cond使用运算符处理逻辑条件,并使用特殊操作$$KEEP来“保留”逻辑条件为真的$$PRUNE文档或“删除”条件为真的文档错误的。

考虑运行以下聚合操作来演示上述概念:

db.test.aggregate([
    { "$redact": {
        "$cond": [
            { "$gt": ["$modified", "$sync"] },
            "$$KEEP",
            "$$PRUNE"
        ]
    } }
])
Run Code Online (Sandbox Code Playgroud)

此操作类似于拥有一个$project管道,该管道选择集合中的字段并创建一个新字段,该字段保存逻辑条件查询的结果,然后是后续$match,不同之处在于$redact使用更高效的单个管道阶段: