![在 MongoDB 分片集群中恢复数据库有何特殊之处?](https://linux22.com/image/804305/%E5%9C%A8%20MongoDB%20%E5%88%86%E7%89%87%E9%9B%86%E7%BE%A4%E4%B8%AD%E6%81%A2%E5%A4%8D%E6%95%B0%E6%8D%AE%E5%BA%93%E6%9C%89%E4%BD%95%E7%89%B9%E6%AE%8A%E4%B9%8B%E5%A4%84%EF%BC%9F.png)
我想将数据库从一个副本集迁移到另一个属于分片集群的副本集。到目前为止,此集群只有 1 个分片,并且没有集合或数据库真正分片。
我 mongodump 并恢复了这个数据库。从分片集群的一个 mongos 中,我可以运行一个简单的查询,如 find(),但包括以下投影在内的某些操作不再起作用:
“find({“var1”:subvar},{“_id”:0,“fld1”:1,“fld2”:1,“fld3”:1})。limit(1)。sort(”_id“,pymongo.DESCENDING)”
我收到以下错误消息:
数据库错误:投影中必须有排序键并将其删除
这肯定是与分片相关的问题,因为我将此数据库恢复到开发独立的 mongodb 服务器并且测试成功运行。
提前致谢,
格雷格。
答案1
mongorestore 没有这个问题。如果您在 2.2+ 版的分片数据库中创建新集合,您将看到相同的行为。
mongos> db.version()
2.2.6
mongos> db.foo.save({id:3, value:'c'})
mongos> db.foo.save({id:2, value:'b'})
mongos> db.foo.save({id:1, value:'a'})
mongos> db.foo.find({}, {id:0}).sort({id:1})
error: {
"$err" : "have to have sort key in projection and removing it",
"code" : 13431
}
显然,2.0 中的行为有所不同。
mongos> db.version()
2.0.9
mongos> db.foo.save({id:3, value:'c'})
mongos> db.foo.save({id:2, value:'b'})
mongos> db.foo.save({id:1, value:'a'})
mongos> db.foo.find({},{id:0}).sort({id:1})
{ "_id" : ObjectId("523bd35dff9a7c468936efba"), "value" : "a" }
{ "_id" : ObjectId("523bd358ff9a7c468936efb9"), "value" : "b" }
{ "_id" : ObjectId("523bd352ff9a7c468936efb8"), "value" : "c" }
我打开了服务器-10381看看如果您愿意遵循它,这是否是预期的。
编辑:这是预料之中的。当查询通过 mongos 运行时,预计该键会存在,以便可以合并和排序各个分片的结果。在 2.2 之前,单个分片/未分片集合的逻辑显然不同,但为了保持一致性,它被改变了。
文档将会更新以反映他的限制。