好吧,我发现自己遇到了一个简单但烦人的问题。我的mongo文档使用java.util.Date作为ID,您可能会猜到ID已被转换(弹簧转换器)为ObjectId,所以我无法更新这些文档,因为每次创建新的ObjectId(Date)时都会获得一个完全即使日期相同,ID也不同...
我如何强制mongo仅使用java.util.Date作为ID?
提供示例代码:
public void updateNode(...node..) {
final MongoTemplate mongoTemplate = ...
final String collectionName = ...
final Query query = (new Query()).addCriteria(Criteria.where("time").is(node.getTime()));
final Update update = Update.update("time", node.getTime()).set("top", node.getTop())
.set("bottom", node.getBottom()).set("mid", node.getMid())
.set("startTime", node.getStartTime()).set("potential", node.isPotential());
mongoTemplate.upsert(query, update, MyClassNode.class, collectionName);
}
如果我是第一次运行此代码,则将对象插入到数据库中,但是使用ObjectId ...如果node.getTime()是java.sql.Date,那么一切都很好。
如果node.getTime()不是java.sql.Date,则无法更新文档(如果存在):为什么?因为每次准备文档时都会创建一个新的ObjectId,所以更新和查询将具有两个不同的_id字段值,并且更新失败。
答案 0 :(得分:0)
在检查文档时,我发现了以下详细信息:
在MongoDB中,存储在集合中的每个文档都需要一个唯一的_id 充当主键的字段。如果插入的文档省略了 _id字段,MongoDB驱动程序会自动为_id字段生成一个ObjectId。
这也适用于通过更新操作插入的文档 upsert:是的。
以下是用于存储_id值的常用选项:
我从文档中了解到,为避免多次插入同一文档,请仅在查询字段具有唯一索引的情况下使用upsert: true
。因此,如果设置了此标志,则会发现您的ID已转换使用ObjectId()使它唯一。