Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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 使用Spring和Spring数据更新集合中的对象_Java_Spring_Mongodb_Spring Data - Fatal编程技术网

Java 使用Spring和Spring数据更新集合中的对象

Java 使用Spring和Spring数据更新集合中的对象,java,spring,mongodb,spring-data,Java,Spring,Mongodb,Spring Data,我试图将一个POJO保存到MongoDB集合中,然后更新同一个对象。它被称为“发现”对象,具有以下字段集: private String displayName; private String description; private String contact; private String defaultApiRoot; private List<String> apiRoots; 将创建索引,并通过以下方式进行验证: > db.discovery.getIndexes

我试图将一个POJO保存到MongoDB集合中,然后更新同一个对象。它被称为“发现”对象,具有以下字段集:

private String displayName;
private String description;
private String contact;
private String defaultApiRoot;
private List<String> apiRoots;
将创建索引,并通过以下方式进行验证:

> 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数据,但是从我所能找到的每个SO问题和文档来看,对一个具有重复的
displayName
的发现对象执行
.save()
,应该会导致该对象的字段发生上插

我正在尝试更新对象,如下所示:

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是如何在这里工作的,但如果有人能帮我解释一下,我将不胜感激。如果我可以进行一次DB调用来更新对象,则可以获得额外的积分。我知道对象的索引键,因此我实际上不需要进行
.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());  
我同意这一说法

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());  

@pvpkiran所说的对这个问题是正确的。对于主要问题,我使用以下代码根据标题更新特定的ApiRoot:

    Query query = new Query(new Criteria("title").is(apiRoot.getTitle()));
    Update update = new Update();
    update.set("description", apiRoot.getDescription());
    update.set("versions", apiRoot.getVersions());
    update.set("maxContentLength", apiRoot.getMaxContentLength());
    mongoOperations.upsert(query, update, apiRootCollection);

@pvpkiran所说的对这个问题是正确的。对于主要问题,我使用以下代码根据标题更新特定的ApiRoot:

    Query query = new Query(new Criteria("title").is(apiRoot.getTitle()));
    Update update = new Update();
    update.set("description", apiRoot.getDescription());
    update.set("versions", apiRoot.getVersions());
    update.set("maxContentLength", apiRoot.getMaxContentLength());
    mongoOperations.upsert(query, update, apiRootCollection);