当前位置: 首页 > 知识库问答 >
问题:

mongoDB忽略唯一索引

柏正平
2023-03-14

我构建了一个REST服务,发现使用Gson从ObjectId生成的JSON字符串的格式与Spring-Boot生成的格式不同。如果我以GSON格式将现有文档的_id字段的ObjectId发送到REST服务,并使用MongoRepository的save函数将其保存到集合中,即使在这样的字段上设置了唯一的索引,仍会插入具有duplicated_id的新文档。但是,如果我以spring-boot生成的格式发送ObjectId,那么一切都能正常工作。我在想是什么导致了这样的问题?

        "timestamp": 1558461711,
        "machineIdentifier": 5077764,
        "processIdentifier": 21816,
        "counter": 13546695,
        "date": "2019-05-21T18:01:51.000+0000",
        "time": 1558461711000,
        "timeSecond": 1558461711(generated by spring-boot)


        "counter": 13546695,
        "randomValue1": 9256029,
        "randomValue2": 856,
        "timestamp": 1558461711(by GSON)

共有1个答案

万俟渊
2023-03-14

如果您正在使用mongodb,最好使用org.bson.document(由mongodb依赖项提供)或其他mongodb类将文档转换为json,而不是GSON。

Document document = new Document();
document.put("_id", new ObjectId());
String json = document.toJson()

document.tojson()应该以正确的方式确定ObjectId。实际上,上面代码的输出将是:

{ "_id" : { "$oid" : "5ce51fb47dda11a8507087eb" } }

这是mongodb的有效格式,但不确定SpringBoot会对它做出什么反应。
无论如何,希望它会有所帮助。

 类似资料:
  • 在MongoDB3.2中有可能避免这种情况吗?

  • 问题内容: 我有一个MySQL表来保存标签(即像在Stack Overflow上使用的那些标签)。它仅具有一个id(pk)和一个标签列来保存标签本身。 我的Tag实体的带注释的get方法如下所示。 我在标签上使用了唯一的列约束,因为给定标签的行不应超过一行。但是,Hibernate似乎忽略了这一点,即我可以多次保存完全相同的标签,并且它只是创建一个新行而不是抛出异常。 我是否缺少某些东西,还是应该

  • 问题内容: 我正在尝试在表中的两个字段上创建唯一约束。但是,很可能一个人将为空。我只要求如果它们都不为null(永远不会为null),则它们必须是唯一的。 忽略表和字段名称的语义以及这是否有意义-我刚刚做了一些补充。 有没有一种方法可以在这些字段上创建唯一约束,从而对两个非null值强制执行唯一性,但是如果有多个条目(非null和null),则可以忽略呢? 这个问题是针对SQL Server的,我

  • 在MongoDB 2.6.5上使用mongo shell运行查询 问题是:。limit()似乎忽略了。排序()。 这是正常的行为吗?我不认为应该这样做,但我不确定。如果没有,有没有办法让它通过排序然后限制而不是限制然后排序来工作。 我正在运行以下查询 db。邮递查找({categories:{$in:[“101”]},位置:{$near:[1.310000,103.700000],$maxDist

  • 问题内容: 但是,当我删除WHERE时,查询会停止使用该键(即使我明确地强制使用该键也是如此) 有什么解决方法吗? 我意识到我在第二个示例中选择了整个表,但是为什么mysql突然决定它还是要忽略我的FORCE而不使用键?没有密钥,查询大约需要10分钟。 问题答案: FORCE有点用词不当。这是MySQL文档所说的(重点是我的): 您还可以使用FORCE INDEX,其作用与USE INDEX(in

  • 本文向大家介绍如何仅显示MongoDB中的唯一记录,而忽略重复记录?,包括了如何仅显示MongoDB中的唯一记录,而忽略重复记录?的使用技巧和注意事项,需要的朋友参考一下 要仅显示唯一记录,请在MongoDB中使用distinct()。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是获取唯一记录的查询- 这将产生以下输出-