首页 > 解决方案 > 查询不匹配的结果在 MongoDB Shard 环境中,

问题描述

我是这样配置的:

* configDB 1
* configDB 2
* configDB 3
* Mongos
* mongod (cluster_1)
* mongod (cluster_2)

shardkey : num (field)
shardkeyrange: 1~5 -> cluster1
shardkeyrange: 6~10 -> cluster2

我使用下面的查询在 db (mongos) 中插入了 10 个数据

db.A.insert({"num":1});
db.A.insert({"num":2});
db.A.insert({"num":3});
db.A.insert({"num":4});
db.A.insert({"num":5});
db.A.insert({"num":6});
db.A.insert({"num":7});
db.A.insert({"num":8});
db.A.insert({"num":9});
db.A.insert({"num":10});

在 mongod(cluster_1, cluster_2) 中查找查询

db.A.find({}).count; // cluster_1
> 5
db.A.find({}).count; //cluster_2
> 3

期望值:

>5
>5

可以看出,每个分片服务器中存储了 5 条数据。但是当我查询每个集群时,cluster_1 有 5 个数据,cluster_2 有 3 个数据。这并不总是发生。这种现象似乎偶尔会发生。

有没有可能发生类似现象的情况?在数据库中执行特定操作时会发生这种情况吗?像块迁移..我想知道可能导致上述现象的各种情况或原因

标签: mongodbshardingchunksmongodb-replica-set

解决方案


众所周知,这种.count方法是不准确的,因为它只检查元数据而实际上并不计算文档。此方法在最新版本的 MongoDB 中已弃用。

您可以尝试一些方法:

  • db.A.countDocuments()- 此功能仅存在于最新版本中
  • db.A.count({num:{$gt:0}})- 过滤器count会导致它读取文档并计算它们
  • db.A.find({}).itcount()- 这将从服务器获取所有文档,将它们传递给驱动程序/外壳并在客户端计算它们

推荐阅读