在对 MongoDB 地理数据查询进行单元测试期间,我收到以下错误消息:
找不到任何特殊索引:2d(需要索引),2dsphere(需要索引),对于:{ address.location: { $nearSphere: { x: -120.0, y: 47.0 }, $maxDistance: 0.01567855942887398 }, status: “在里面” }; 嵌套异常是 com.mongodb.MongoException: can't find any special index: 2d (needs index), 2dsphere (needs index), for: { address.location: { $nearSphere: { x: -120.0, y: 47.0 } , $maxDistance: 0.01567855942887398 }, 状态: "INIT" }
createIndex但是,运行该命令后,我收到以下错误:
db.store.createIndex({"address.location":"2d"}) 预期位置对象,位置数组格式不正确 db.store.createIndex({"address.location":"2dsphere"}) 无法提取来自对象的地理键,畸形几何?:{类型:“点”,坐标:[47.399465,-122.2950165]}
文档数据的结构如下:
{
....
"address" : {
"street" : "Street One",
"city" : "One City",
"province" : "aProvince",
"country" : "aCountry",
"postalCode" : "91202",
"location" …Run Code Online (Sandbox Code Playgroud) 我有以下结构:
\n\n{ \n "_id" : "adddddddddddd", \n "_class" : "com.fluidm.service.identity.entity.Item", \n "itemName" : "satyam", \n "personList" : [ ]\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我有一个集合,比如说“项目”,其中包含人员列表,这些人员列表在内部作为数组存储在 MongoDB 中。
\n\n我想使用MongoTemplate方法将一个人对象或一堆人对象插入到列表中。
\n\n我尝试过推送方法,但没有成功。
\n\nmongoTemplate.updateFirst(Query.query(Criteria.where("_id").is("\xe2\x80\x8badddddddddddd")), new Update().push("personList", person), Item.class);\nRun Code Online (Sandbox Code Playgroud)\n\nPS:我不想使用本机方法插入数据。
\n我正在尝试使用 MongoTemplate 在 Spring Data 中实现以下工作 mongoDb 查询:
db.answers.aggregate([
{ "$match" : { "object_id" : "1" } },
{ "$project": { 'answer_list': 1, 'profile': { $filter : { input: '$answer_list', as: 'answer', cond: { $eq: [ '$$answer.question', 2 ] } } } } },
{ "$unwind" : "$profile"},
{ "$unwind" : "$answer_list"},
{ "$group" : { "_id" : { "question" : "$answer_list.question", "answer" : "$answer_list.answer", "criteria" : "$profile.answer"}, "count" : { "$sum" : 1 } } },
{ "$sort" : …Run Code Online (Sandbox Code Playgroud) 我可以有一个可为空的字段吗?-如果其值为null,则不会在文档中存储该字段(名称或值);以及-如果其值为非null,则将字段名称和值存储在它。
我们遇到了以下我们理解的行为,但是我们想知道它是否是预期的,以及将它记录为某种陷阱可能是有意义的.
我们正在试验Spring Boot 2/Spring WebFlux并设置一个基本上有这样的东西的小应用程序(全部缩短):
@PostMapping
public Mono<Todo> addTodos( @RequestBody Person person ) {
return personService.addPerson( person );
}
Run Code Online (Sandbox Code Playgroud)
该服务首先看起来像这样,因为我们想要将一个人的事件也发布到消息队列:
public class PersonService {
public Mono<Person> addPerson( Person person ) {
Mono<Person> addedPerson = personRepository.save( person );
addedPerson.subscribe( p -> rabbitTemplate.convertAndSend( "persons", p ) );
return addedPerson;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,这样做显然是错误的.该.subscribe()触发器的流动和我们假设反应REST控制器确实在背景相同的序列化的数据的响应,从而导致第二平行流动之前.最后,我们最终persons在数据库中的集合中有两个重复的条目.
在这个冗长的介绍之后,最后的问题是:这是多个订阅者触发多个插入的预期行为(基本上,如果您订阅n时间,您会获得n插入)?
如果是的话,这对于初学者来说可能是一个陷阱,特别是如果我们的理解是正确的,那么反应式REST控制器就会发挥作用.subscribe().
spring spring-mvc spring-data-mongodb project-reactor reactive
我正在尝试根据从 Thymeleaf 驱动的页面获得的一些信息来更新数据库信息。基本上每个页面都是使用来自 MongoDB 的单个文档构建的。现在我想允许一些用户更改这个页面,因为实际页面并不那么复杂,我正在尝试这个 JavaScript 插件,它可以创建文本区域 div 并通过 Ajax 将它们发送到服务器(http:// www.dyve.net/jquery/?editable)。
由于文档只有唯一的字段,我可以将 html 中的字段 id 设置为 mongodb 字段的名称,例如 product-description。我可以通过发送 id 并且更新非常简单:
public boolean updateValueWithKey(String id, String k, String v) {
Criteria c = Criteria.where(id).is(id);
Query q = new Query().addCriteria(c);
Update u = u.set(k, v);
WriteResult w = operations.updateFirst(q, u, clazz);
return w.wasAcknowledged();
}
Run Code Online (Sandbox Code Playgroud)
其中 id 是文档 ID 代码,k 是字段名称(键),v 是值。
但是我意识到文档的一个特定部分有一个数组,但我不明白如何更新数组的特定字段。
Update 类有一个名为 PushOperatorBuilder 的内部类,其中有一个名为 atPosition 的方法,文档中提到:“强制在给定的 {@literal position} 处添加值。”
但我真的不明白如何使用它,任何从实例化的 Update 对象访问该方法的尝试都会给我错误。
帮助?
目前,我们正在寻找一种解决方案,将以下User实体同时保存到多个 MongoDB 集合中(即db_users和 on db_users_legacy)。两个集合都在同一个数据库中。
请不要问我为什么需要保存在两个集合中。这是业务需求。
@Document(collection = "db_users")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
private String id;
private String name;
private String website;
private String name;
private String email;
}
Run Code Online (Sandbox Code Playgroud)
我的 SpringBoot 应用程序配置如下;
@Configuration
public class ApplicationConfig {
@Bean
public MongoTemplate mongoTemplate(MongoDbFactory factory){
MongoTemplate template = new MongoTemplate(factory);
template.setWriteConcern(WriteConcern.ACKNOWLEDGED);
retu,rn template;
}
}
Run Code Online (Sandbox Code Playgroud)
目前我的存储库看起来像这样。并且保存工作得很好。如何在两个不同的集合中相同此文档?
@Repository
public class UserRepositoryImpl implements UserRepository {
private MongoTemplate mongoTemplate;
public UserRepositoryImpl(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试优化我的MongoDB集合。这是示例:
@Document
class Article {
@Id
private String id;
@DBRef(lazy = true)
@CascadeSave
private List<Comment> comments;
private String title;
private String text;
// constructors, getters and setters are ommited
}
@Document
class Comment {
@Id
private String id;
private String text;
private String author;
// constructors, getters and setters are ommited
}
Run Code Online (Sandbox Code Playgroud)
看起来很简单。获取文章,然后获取本文的所有评论。但是,如果我已经有文章ID,并且只想获取文章的所有注释该怎么办?当然也很简单。每个评论都应引用其所属的文章(例如article_id)。
我的问题是如何自动执行?保存/更新等时如何在评论中插入article_id?还是我应该将字段添加到Comment类,然后首先保存文章,然后获取article_id,然后获取评论,添加article_id,保存评论并向文章评论集合添加评论?这对我来说毫无意义。
我正在使用带有Spring Boot 2.0.5的Java 10,其中包括spring-data-mongodb和反应驱动程序。我还实现了@CascadeSave批注,用于在保存文章时保存评论。
多谢您的回覆。
我正在使用 Spring Boot 3.0.3、Spring Core 6.0.5 和 Spring Data MongoDB 4.0.2。我看到许多以下形式的警告消息
ocalVariableTableParameterNameDiscoverer : Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: <your mongo entity here>
Run Code Online (Sandbox Code Playgroud)
在消息源插入断点,我得到以下堆栈跟踪:
apply:-1, LocalVariableTableParameterNameDiscoverer$$Lambda$1162/0x00000008013cfa98 (org.springframework.core)
computeIfAbsent:1708, ConcurrentHashMap (java.util.concurrent)
doGetParameterNames:96, LocalVariableTableParameterNameDiscoverer (org.springframework.core)
getParameterNames:90, LocalVariableTableParameterNameDiscoverer (org.springframework.core)
getParameterNames:67, PrioritizedParameterNameDiscoverer (org.springframework.core)
buildPreferredConstructor:236, PreferredConstructorDiscoverer$Discoverers (org.springframework.data.mapping.model)
discover:118, PreferredConstructorDiscoverer$Discoverers$1 (org.springframework.data.mapping.model)
discover:82, PreferredConstructorDiscoverer (org.springframework.data.mapping.model)
discover:81, InstanceCreatorMetadataDiscoverer (org.springframework.data.mapping.model)
<init>:113, BasicPersistentEntity (org.springframework.data.mapping.model)
<init>:84, BasicMongoPersistentEntity (org.springframework.data.mongodb.core.mapping)
createPersistentEntity:88, MongoMappingContext (org.springframework.data.mongodb.core.mapping)
createPersistentEntity:41, MongoMappingContext (org.springframework.data.mongodb.core.mapping)
doAddPersistentEntity:403, AbstractMappingContext (org.springframework.data.mapping.context)
addPersistentEntity:379, …Run Code Online (Sandbox Code Playgroud) 我不知道之间的区别JpaRepository和MongoRepository。