mongodb 如何从mongo数据库中检索包含2dsphere索引实体

lc8prwob  于 2023-01-20  发布在  Go
关注(0)|答案(2)|浏览(187)

在mongo数据库中创建的索引

实体中的字段

@Indexed(name = "2dsphere")
    private Point location;

mongo数据库中的此字段

"location": 
     {    "type": "Point",    
          "coordinates": 
                       [      41.035137,      28.98953    ]  
     }

尝试从mongo数据库检索实体

repository.findById(id).orElse(null)引发以下错误
例如,获取消息():应将文档文档{{type=Point,coordinates=[41.015137,28.97953]}}读入类型类com.mongodb.client.model.geojson.Point,但未找到后者的持久性实体!

qc6wkl3g

qc6wkl3g1#

如果你通过Hibernate或者其他方式使用仓库,java会尝试Map文档和类类型。2不幸的是,这种方式很慢,而且不是一种优化的方式
如果你使用原生查询,mongo返回文档类型。2如果你想要列表或分页,那么数据类型是无关紧要。3因为mongo已经返回json类型。4如果你想要返回任何响应对象,那么可以使用**$project**stage。
但是如果你想获取一个实体,更新它并保存它,你需要自己的数据类型,那么你现在就可以使用MongoCursor。
什么是MongoCursor?MongoCursor就像一个集合。存储给定类型的数据。这种方式作为原生查询非常快。
示例:

MongoCursor<YourClassType> gym = database.getCollection(collectionName,YourClassType.class).aggregate(Arrays.asList(
            new Document("$addFields", new Document("_id", new Document("$toString", "$_id"))),
            new Document("$match", new Document("_id", byIdRequest.getId()))
    )).cursor();

MongoCursor文档:https://www.mongodb.com/docs/manual/reference/method/js-cursor/
重点!:你必须添加第一个添加字段阶段,因为你存储ObjectId类型,但你的实体有字符串id字段。不要忘记这个阶段。

83qze16e

83qze16e2#

只是不得不解决同样的问题。我发现MappingMongoConverter正在寻找CodecRegistryProvider为几何类型提供编解码器,但CodecRegistryProvider为空。

我不知道为什么没有设置它,但我通过创建一个等待ContextRefreshedEvent并手动设置codecRegistryProvider的组件解决了这个问题。

package thePackage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.data.mongodb.CodecRegistryProvider;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.stereotype.Component;

@Component
public class MongoSetup{
    private final MappingMongoConverter mappingMongoConverter;
    private final CodecRegistryProvider codecRegistryProvider;

    @Autowired
    public MongoSetup(MappingMongoConverter mappingMongoConverter, CodecRegistryProvider codecRegistryProvider) {
        this.mappingMongoConverter = mappingMongoConverter;
        this.codecRegistryProvider = codecRegistryProvider;
    }

    @EventListener(ContextRefreshedEvent.class)
    public void initMongo() {
        mappingMongoConverter.setCodecRegistryProvider(codecRegistryProvider);
    }
}

相关问题