gpt4 book ai didi

javascript - 如何正确地增加 mongoDB 中的许多日期?

转载 作者:数据小太阳 更新时间:2023-10-29 03:51:21 26 4
gpt4 key购买 nike

我不是一个特别擅长 Javascript 的人,我在尝试更新 Mongo 中的大量 Date 对象时遇到了一些麻烦。

似乎$inc has not yet been implemented for Date objects .因此,为了尝试按天增加一组日期,我通过 mongo myScript.js 从 bash 调用(类似的)这个脚本:

conn = new Mongo();
db = conn.getDB('myDatabase');

var incrementDates = function() {
db.blah.find(myQuery).forEach(function(doc) {

db.blah.update(
{ _id : doc._id
, my_date : { $exists : true }
}
, { $set : { my_date : new Date(doc.my_date.getTime() + 86400000) }}
);

});
}

incrementDates();

基本思想似乎在 mongoDB shell 中运行良好:

> var doc = db.blah.findOne(myQuery)
> doc.my_date
ISODate("1962-11-02T23:00:00Z")
> new Date(doc.my_date.getTime() + 86400000);
ISODate("1962-11-03T23:00:00Z")

但在脚本中不太好:

TypeError: doc.my_date has no properties

所以我认为我正在尝试在某个地方的 null 上调用 getTime,即使我的更新中的查询应该只返回 my_date 的文档 存在。

关于这里发生的事情有什么想法吗?更重要的是:有没有更好的方法来做到这一点?

最佳答案

Mongo 4.2 开始,db.collection.update()可以接受聚合管道,最终允许根据自己的值更新字段;从而避免低效的查找/foreach 模式。

此外,您正在查看 $inc 运算符来添加一天,但现在我们可以使用聚合管道作为更新,$add可以使用运算符:

// { "date" : ISODate("2020-04-05T07:14:17.802Z"), "x" : "y" }
db.collection.updateMany(
{ date : { $exists : true } },
[{ $set: { date: { $add: ["$date", 24*60*60000] } } }]
)
// { "date" : ISODate("2020-04-06T07:14:17.802Z"), "x" : "y" }
  • 第一部分 { date : { $exists : true } } 是匹配查询,过滤要更新的文档(在我们的例子中所有文档都有 date 字段)。

  • 第二部分[{ $set: { date: { $add: ["$date", 24*60*60000] } } }] 是更新聚合管道(请注意表示使用聚合管道的方括号)。 $set是一个新的聚合运算符和 $addFields 的别名。然后在$set阶段可以使用任何聚合操作符;在我们的例子中是一个简单的 $add现有日期和一天的表示之间的转换(以毫秒为单位)。

关于javascript - 如何正确地增加 mongoDB 中的许多日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18759375/

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