用于日期比较的Mongodb聚合

时间:2017-03-30 07:03:34

标签: mongodb aggregation-framework

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

{
    "_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字段中。如何实现呢?

1 个答案:

答案 0 :(得分:0)

我使用同一文档中的格式化日期字段更新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,它将获取聚合管道返回的文档并将它们写入指定的集合。

希望它有帮助!