我刚刚从SQL数据库导入了一些数据到MongoDB集合中,并且正在做一些重构。我刚刚从“YYYY-MM-DD”格式转换为字符串日期值有:我可以在控制台中从日期创建新的ObjectId var吗?
db.Statistic.find({d: {$exists: false}}).forEach(function (x) {
var d = ISODate(x.date);
db.Statistic.update(x, {$set: {"d": d}});
});
这一直运作良好。现在我想用一个使用这个日期的_id重建对象,这样我就不需要单独的日期字段。我曾尝试(和许多变化):
db.Statistic.find({d: {$exists: true}}).forEach(function (x) {
var oldId = x._id;
x._id = new ObjectId(x.d);
db.Statistic.save(x);
db.Statistic.remove({_id: oldId});
});
,但我得到Error: invalid object id: length
我假设,因为控制台的ObjectID构造函数不接受日期以建立一个新的对象ID。在控制台中有没有办法做到这一点?
关于第2部分,我意识到这一点 - 这就是为什么我不尝试更改现有保存文档的_id的原因。我保存一个新文档(只是重复使用这些字段),然后删除旧文档,以便它位于同一个集合中。我同意我可能应该导入到临时集合中,然后将重构对象保存到最终集合中。 –
@NicholasTolleyCottrell啊。 ** save **函数(回答中的链接)显式地保持原始'_id'完好无损。那是那里的问题。现在解释。 –
我不认为这是问题,因为它甚至没有保存。根据你的文档:'如果文档包含_id字段,则save()方法执行一个upsert,查询_id字段上的集合。如果文档不存在指定的_id值,则save()方法将执行insert操作。由于我设置了一个新的不存在的_id,因此upsert应该为我正确插入一个新文档。 –