【问题标题】:Mongodb aggregation for date comparison用于日期比较的 Mongodb 聚合
【发布时间】:2017-03-30 23:17:04
【问题描述】:

我有一个包含以下格式的文档的集合。

{
    "_id" : ObjectId("58d9fa5cb35630097b96acab"),
    "invoice_id" : ObjectId("58d9fa5cb35630097b96acaa"),
    "amount" : 717.6,
    "date" : "2017-03-28",
    "by_id" : ObjectId("58d9d6a0b35630097b96a729")

},
{
    "_id" : ObjectId("58d9ff77b35630097b96acb8"),
    "invoice_id" : ObjectId("58d9ff77b35630097b96acb7"),
    "amount" : 717.6,
    "date" : "2017-03-28",
    "by_id" : ObjectId("58d9d6a0b35630097b96a729")
}

我需要使用聚合进行日期比较,但文档中的日期格式不正确。所以我试图添加一个名为c_date 的新字段,其日期值格式正确,对每个文档使用$addFields 函数。

db.table.aggregate([
{ $addFields: { c_date : new ISODate('2017-03-29')} }
])

以上查询结果

{
    "_id" : ObjectId("58d9fa5cb35630097b96acab"),
    "invoice_id" : ObjectId("58d9fa5cb35630097b96acaa"),
    "amount" : 717.6,
    "date" : "2017-03-28",
    "by_id" : ObjectId("58d9d6a0b35630097b96a729"),
    "c_date": 2017-03-29 00:00:00.000Z
},
{
    "_id" : ObjectId("58d9ff77b35630097b96acb8"),
    "invoice_id" : ObjectId("58d9ff77b35630097b96acb7"),
    "amount" : 717.6,
    "date" : "2017-03-28",
    "by_id" : ObjectId("58d9d6a0b35630097b96a729")
    "c_date": 2017-03-29 00:00:00.000Z
}

我想将date 字段的格式化值添加到每个文档中的c_date 字段。如何实现?

【问题讨论】:

  • 我认为仍然无法在更新中引用文档本身。您必须以编程方式进行...但是,您需要进行什么样的日期比较?也许你的格式可以做到(例如,字符串比较"2017-03-28">"2017-03-01"true)。
  • 我需要过滤掉两个日期之间的文档
  • 如此简单的字符串比较应该可以工作,如果格式得到完全尊重(天和月总是“02”或“08”,而不是“2”或“8”)。否则,如果您仍想将其转换为真实的日期格式(这是最佳实践),则必须以编程方式循环整个集合,例如使用 forEach

标签: mongodb aggregation-framework


【解决方案1】:

我使用同一文档中的格式化日期字段更新 c_date 的方法如下所示

db.table.find().forEach(function(element){
 element.c_date = new Date(element.date);
 db.table.save(element);
});

初始记录

{
        "_id" : ObjectId("58d9fa5cb35630097b96acab"),
        "invoice_id" : ObjectId("58d9fa5cb35630097b96acaa"),
        "amount" : 717.6,
        "date" : "2017-03-28",
        "by_id" : ObjectId("58d9d6a0b35630097b96a729"),
        "c_date" : ISODate("2017-03-29T00:00:00Z")
}
{
        "_id" : ObjectId("58d9ff77b35630097b96acb8"),
        "invoice_id" : ObjectId("58d9ff77b35630097b96acb7"),
        "amount" : 717.6,
        "date" : "2017-03-28",
        "by_id" : ObjectId("58d9d6a0b35630097b96a729"),
        "c_date" : ISODate("2017-03-29T00:00:00Z")
}

函数执行后

{
        "_id" : ObjectId("58d9fa5cb35630097b96acab"),
        "invoice_id" : ObjectId("58d9fa5cb35630097b96acaa"),
        "amount" : 717.6,
        "date" : "2017-03-28",
        "by_id" : ObjectId("58d9d6a0b35630097b96a729"),
        "c_date" : ISODate("2017-03-28T00:00:00Z")
}
{
        "_id" : ObjectId("58d9ff77b35630097b96acb8"),
        "invoice_id" : ObjectId("58d9ff77b35630097b96acb7"),
        "amount" : 717.6,
        "date" : "2017-03-28",
        "by_id" : ObjectId("58d9d6a0b35630097b96a729"),
        "c_date" : ISODate("2017-03-28T00:00:00Z")
}

使用$project,您可以添加新字段或将文档中的现有字段投影到管道的下一阶段,但无法修改/更新同一文档上的字段。

而我们有一个解决方法和$out,它将获取聚合管道返回的文档并将它们写入指定的集合。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多