java - 使用 Spring 和 Spring Data 更新集合中的对象

标签 java spring mongodb spring-data

我正在尝试将单个 POJO 保存到 MongoDB 集合中,然后更新同一对象。它称为“Discovery”对象,并且具有以下字段集:

private String displayName;
private String description;
private String contact;
private String defaultApiRoot;
private List<String> apiRoots;

我希望“displayName”是唯一的,因此我创建一个索引,如下所示:

mongoOperations.indexOps(Discovery.class)
    .ensureIndex(new Index().on("displayName", Sort.Direction.ASC));

索引已创建,并通过以下方式验证:

> db.discovery.getIndexes()
[
  {
    "v" : 2,
    "key" : {
      "_id" : 1
    },
    "name" : "_id_",
    "ns" : "apiroot.discovery"
  },
  {
    "v" : 2,
    "key" : {
      "displayName" : 1
    },
    "name" : "displayName_1",
    "ns" : "apiroot.discovery"
  }
]

也许我误解了索引和 Mongo 或 Spring Data,但是从我找到的每个 SO 问题和文档中,使用具有以下功能的 Discovery 对象执行 .save()重复的 displayName 应该会导致对该对象的字段进行更新插入。

我正在尝试按如下方式更新对象:

Discovery discovery = discoveryRepository.findByDisplayName(displayName);
if (discovery.getApiRoots() == null || discovery.getApiRoots().isEmpty()) {
    discovery.setApiRoots(apiRoots);
} else {
    discovery.getApiRoots().addAll(apiRoots);
}
discoveryRepository.save(discovery);

这会产生两个对象:

> db.discovery.find()
{
    "_id" : ObjectId("5a16ee397e7a1b3789c970a7"),
    "_class" : "....Discovery",
    "displayName" : "X",
    "description" : "Default Discovery Description",
    "contact" : "paul@arrakis.com",
    "defaultApiRoot" : "Default API Root Display Name"
}
{
    "_id" : ObjectId("5a16ee3f7e7a1b3789c970a8"),
    "_class" : "....Discovery",
    "displayName" : "X",
    "description" : "Default Discovery Description",
    "contact" : "paul@arrakis.com",
    "defaultApiRoot" : "Default API Root Display Name",
    "apiRoots" : [
        "https://localhost:8001/Default+API+Root+Display+Name"
    ]
}

当我尝试“获取”对象时 discoveryRepository.findByDisplayName(displayName),我得到:

{
    "display_name": "FLARE",
    "description": "Default Discovery Description",
    "contact": "paul@arrakis.com",
    "default": "Default API Root Display Name"
}

我确信我完全没有理解 Mongo 在这里是如何工作的,但如果有人能帮助阐明这一点,我将非常感激。如果我可以进行一次数据库调用来更新对象,那就加分了。我知道该对象的索引键,因此我实际上不需要进行 .find() 调用,但在任何一种情况下我都无法让它工作。

TL;DR:使用 Spring 和 MongoDB,如何根据 _id 以外的索引键更新存储在集合中的对象的字段子集?

最佳答案

有了这个声明

mongoOperations.indexOps(Discovery.class)
    .ensureIndex(new Index().on("displayName", Sort.Direction.ASC));  

您只是创建一个索引,这将使您的搜索速度更快,但并不表示您希望它是唯一的

这样做

mongoOperations.indexOps(Discovery.class)
        .ensureIndex(new Index().on("displayName", Sort.Direction.ASC).unique());  

关于java - 使用 Spring 和 Spring Data 更新集合中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47459666/

相关文章:

java - 线程 "main"org.owasp.esapi.errors.ConfigurationException : 中出现异常

java - ExpandableListView parent 中的不同开关 Intent - 前一个不起作用

java - Oracle 序列可以为空吗?

angularjs - IE 在使用 NTLM 身份验证时随机发送空 POST 正文(使用 Angular 到 Spring)

java - JpaRepository 在角色列表中查找具有角色的用户

javascript - foreach 内的 mongoose find()

node.js - 添加新类别时,Mongoose 架构会抛出错误

java - 普通构造函数和修改器之间的区别? java

java - 当我在 Jpanel 中使用 drawImage 时,为什么它会失败

ruby-on-rails - 未能安装 bson_ext