5

我们有一个包含对象集合的开发服务器。这些对象的实际积累是一个持续的过程,它在这个本地的开发服务器上运行一个标签、验证等整个过程。一旦这些对象准备好生产,它们就会被添加到生产数据库中,从那时起,生产数据库将在其计算中使用它们。

我正在寻找一种方法来简单地将增量(新对象)添加到生产数据库中,同时将所有其他集合和旧对象保留在同一个集合中。到目前为止,我们使用的是 MySql,所以这个过程只涉及运行 DB 结构和数据同步(为此我们使用了 Navicat)。我们现在正在迁移到 MongoDB,所以这个过程有点棘手。

我对此进行了研究,我认为以下解决方案不符合我的需求:

  1. 转储开发数据库并使用mongodumpthen将其加载到生产数据库中mongorestore
  2. 运行db.copyDatabase- 实际上用开发数据库的副本替换生产数据库。

这两种解决方案都有问题,因为它们实际上取代了生产数据库,而我只想更新现有集合中的对象。此外,Dev => Production 不适合主从拓扑。

我能想到的最好的事情是:

  1. 将开发数据库复制到生产实例上的“开发”数据库中。
  2. 将此开发数据库中的集合复制到实际生产数据库中,并添加一个谓词,即我将仅添加生产数据库中不存在的对象,类似于此解决方案

我想知道是否有人有更好的解决方案?

如果没有,是否有人有可以执行此操作的脚本?

4

3 回答 3

1

您可以使用mongoexport工具从开发数据库中导出单个集合。将它与 --query 选项结合使用,您可以在其中表达谓词。例如,诸如${ts : {$gt : previous clone time}}.

然后,使用mongoimport将您的增量文件导入生产数据库。如果您有两个具有不同值的不同逻辑文档,但表示相同的文档, 请使用--upsertand--upsertFields_id

于 2013-08-01T15:50:25.383 回答
1

@Orid,感谢您的回答,对于迟到的回复感到抱歉。

经过大量研究和一些试错后,我决定使用问题中所述的解决方案(将测试数据库复制到机器,然后一一复制集合)。这是因为我在这里使用的数据是静态数据,没有真正的理由需要时间戳。另外,我决定放弃“仅更新”的要求,所以现在我使用 mongorestore--drop

我使用这个脚本来做这一切:

  1. 外壳脚本文件:

rm -rf dump/;

mongo copyTestDb.js;

for COLLECTION in <Collections>
do
mongodump -d nutrino_copy -c $COLLECTION -o dump
mongorestore -d nutrino -c ${COLLECTION} --drop dump/nutrino_copy/${COLLECTION}.bson
done
  1. js脚本文件:

    db.copyDatabase("<dbName>","<dbName_Copy>","<testMachineUrl>")

你认为我应该使用 MongoImport 而不是 MongoRestore 吗?

于 2013-08-12T12:58:05.743 回答
0

查看mongo-sync


这是我为自己编写的脚本,当我不得不不断地将本地MongoDB数据库复制到我的生产数据库中或从我的生产数据库中复制出一个项目时(我知道这很愚蠢)。

将数据库详细信息放入 中后config.yml,您可以使用两个简单的命令开始同步:

./mongo-sync push       # Push DB to Remote
./mongo-sync pull       # Pull DB to Local

如果您在某个项目中使用它,最好添加config.yml.gitignore


mongo-同步演示 gif

于 2015-02-15T00:27:31.137 回答