我们有一个开发服务器,其中包含一组对象。 这些对象的实际累积是一个持续的过程,它在本地开发服务器上运行标记,验证等的整个过程。 一旦这些对象准备好生产,它们就会被添加到生产数据库中,从那时起,它将在计算中使用它们。
我正在寻找一种方法来简单地将delta(新对象)添加到生产数据库中,同时保留所有其他集合以及同一集合中的旧对象。 到目前为止,我们已经使用了MySql,因此这个过程只涉及运行数据库结构和数据同步(我们使用Navicat)。 我们现在转移到MongoDB,所以这个过程有点棘手。
我已经研究过了,我认为以下解决方案不符合我的需求:
mongodump
then mongorestore
db.copyDatabase
- 实际上使用dev DB的副本替换生产数据库。这两个解决方案都存在问题,因为它们实际上取代了生产数据库,而我想要做的就是更新现有集合中的对象。 另外,去Dev =>生产不适合主从拓扑。
我能想到的最好的事情是:
我想知道是否有人有更好的解决方案?
如果没有,是否有人有脚本可以执行此操作?
答案 0 :(得分:1)
您可以使用mongoexport工具从开发数据库中导出单个集合。将它与--query选项结合使用,您可以在其中表达谓词。例如${ts : {$gt : previous clone time}}
。
然后,使用mongoimport将delta文件导入生产数据库。如果您有两个具有不同--upsert
值的不同逻辑文档,请使用--upsertFields
和_id
,但要表达相同的文档
答案 1 :(得分:1)
@Orid,谢谢你的回答,对于迟到的回复感到抱歉。
经过大量研究和一些试错,我决定使用问题中所述的解决方案(复制测试数据库到机器,然后逐个复制集合)。
这是因为我在这里使用的数据是静态数据,没有真正的理由有时间戳。
此外,我已经决定放弃“仅更新”的要求,所以现在我正在使用mongorestore --drop
我使用这个脚本完成所有这些:
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
js脚本文件:
db.copyDatabase("<dbName>","<dbName_Copy>","<testMachineUrl>")
您认为我应该使用MongoImport而不是MongoRestore吗?
答案 2 :(得分:0)
这是我为自己编写的一个脚本,当我不得不经常将我的本地MongoDB
数据库复制到我的生产数据库以进行项目时(我知道它是愚蠢的)。
将数据库详细信息放入config.yml
后,您可以使用两个简单的命令开始同步:
./mongo-sync push # Push DB to Remote
./mongo-sync pull # Pull DB to Local
如果您在某个项目中使用它,最好将config.yml
添加到.gitignore