Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDB碎片删除数据非常慢_Java_Spring_Mongodb_Spring Mongo_Spring Mongodb - Fatal编程技术网

Java MongoDB碎片删除数据非常慢

Java MongoDB碎片删除数据非常慢,java,spring,mongodb,spring-mongo,spring-mongodb,Java,Spring,Mongodb,Spring Mongo,Spring Mongodb,我发现我的MongoDB删除数据非常慢,但查询或插入操作可以 这是我的碎片状态: shards: { "_id" : "shard0000", "host" : "192.168.1.50:27017", "tags" : [ "global" ] } { "_id" : "shard0001", "host" : "192.168.2.50:27017", "tags" : [ "china" ] } 这两个数据库设置在不同的国家。但我确信我在测试中把所有数据都放在了同一个数据库

我发现我的MongoDB删除数据非常慢,但查询或插入操作可以

这是我的碎片状态:

shards:
{  "_id" : "shard0000",  "host" : "192.168.1.50:27017",  "tags" : [ "global" ] }
{  "_id" : "shard0001",  "host" : "192.168.2.50:27017",  "tags" : [ "china" ] }
这两个数据库设置在不同的国家。但我确信我在测试中把所有数据都放在了同一个数据库中

这是记录结构:

{
"_id": ObjectId("56cd5cdae4b0323bc94339e6"),
"eventId": NumberLong(5680),
"opuId": NumberLong(2576),
"eventTime": ISODate("2016-02-24T07:33:46.471Z")},
{
"_id": ObjectId("56cd5cdae4b0323bc94339e7"),
"eventId": NumberLong(5681),
"opuId": NumberLong(2576),
"eventTime": ISODate("2016-02-24T07:34:46.471Z")}
我使用spring框架,下面是我的代码:

查询:

@Query(value = "{'eventId' : ?1}")
public Event findByEventId(long eventId);
删除:

mongoTemplate.remove(query(where("eventId").is(event.getEventId())), Event.class);
通常,保存或查询100条记录需要100毫秒。但逐个删除100条记录需要30秒

但是,如果我使用批删除,它花费不到50毫秒。看起来很正常

mongoTemplate.remove(query(where("opuId").is(opuId)), Event.class);
我找到了原因

由于我的shard key id为opuId,因此我将查询字符串编辑为:

mongoTemplate.remove(query(where("eventId").is(event.getEventId())
                    .andOperator(where("opuId").is(event.getOpuId()))), Event.class);
但我仍然不明白为什么查询可以不询问shard001,而删除却不行。

你有“opuId”的索引吗?如果您运行db.collection.find({“opuId”:1234}).explain(),您会得到哪一个游标(默认值?)。查询是在eventId上运行的,它可能会被索引,甚至被用作碎片键,这可能解释了它为什么很快。