Mongoimport json文件更新还是覆盖?

19

我有一个名为“Project”且集合名称为“sample”的数据库,然后我使用mongoimport命令插入了一个JSON文件。

现在我编辑了同样的JSON文件,如果想将其导入集合,则会遇到多个实例被创建并且未进行更新的问题。

是否有任何方法可以使用mongoimport命令更新或覆盖已经存在于mongodb中的数据?

请注意,我还尝试使用--mode=upsert标志:

./mongoimport --db Project --collection sample --mode=upsert --file   /home/rule.json
7个回答

30

对于 MongoDB v3.x 版本,

--mode=upsert

11

--drop 标志也可以与 mongoimport 命令一起使用,以覆盖/更新现有数据。

--drop


./mongoimport --db Project --collection sample --drop --file   /home/UCSC_rule.json

我提供了这个解决方案,因为我尝试使用 --upsert 标志,但我没有看到任何现有数据的更改,而是创建了一个新实例。


2
请注意,--drop 选项会在从 JSON 文件导入数据之前删除整个集合,而 --mode=upsert 选项则会插入新键并更新现有键。 - Nicolas Payart

7

默认情况下,如果已存在,则跳过操作

但是您可以使用--upsert标志进行更新。


好的,我想要清除并重新导入,所以如果我使用upsert对我来说是好的吗? - Mercer
你可以使用upsert,它将覆盖现有的数据。(擦除+导入=用新数据覆盖。)如果你需要其他的,请告诉我。 - Nachiket Kate
1
无法工作,我在命令行的末尾使用--upsert,但是当我运行db.stats()命令时,对象数量增加了。 - Mercer

2
根据Mongo文档,--mode=upsert在您的情况下不起作用的原因是默认情况下,mongoimport使用_id字段。因此,--drop应该是正确的答案。
--mode=upsert:
默认情况下,mongoimport使用_id字段将集合中的文档与导入文件中的文档匹配。要指定用于匹配upsert和merge模式中现有文档的字段,请使用--upsertFields。
--drop:
修改导入过程,使目标实例在从输入导入数据之前删除集合。 mongoimport document

1

--mode upsert会在_id不匹配时创建新记录。这些_id通过mongodump/mongorestore在不同机器上的数据库中得以保留。

--drop将删除整个集合!

要覆盖一个或多个记录而不删除其他现有记录,请确保在使用--upsert时id匹配。


0
我正在使用1.40.3版本,现在你终于可以不用CMD来完成它了。
更新单元格上的数据,然后点击右下角的更新按钮。
如果你有很多数据,可能会被隐藏起来,你可能需要向下滚动才能看到它。

Where to find UPDATE button on MongoDB Compass


0

使用MongoDb版本3.6.8,以下解决方案对我有效

mongoimport --db <db name> --collection <collection name> --upsert --upsertFields <field name>  --file <path to json file> --jsonArray

在MongoDb中,"field name"是用于比较的关键字名称,而不是默认字段"_id"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接