java - MongoJack 和 updateById 的使用

标签 java mongodb mongojack

我在使用 MongoJack 和 updateById 方法时遇到问题。

在 MongoJack 的 javadoc 中,它指出可以使用 updateById(K, T) ( link to javadoc ) 方法,以 K 为键,以 T 为要保存的对象。然而,下面的代码和测试表明情况并非如此。完整的源代码可以在 Github 上找到:https://github.com/nilsmagnus/mongojackupdatebyid/ .

要保存的对象:

package no.nils.mongoupdate;

  public class Scenario {
  public String _id;
  public String name;

  public Scenario(String name) {
    this.name = name;
  }

  public String get_id() {
    return _id;
  }

  public String getName() {
    return name;
  }
}

更新类:

package no.nils.mongoupdate;

import org.mongojack.JacksonDBCollection;
import org.mongojack.WriteResult;
import com.mongodb.DB;
import com.mongodb.DBCollection;

class ScenarioStorage {
private JacksonDBCollection<Scenario, String> scenarioCollection;

public ScenarioStorage(DB db) {
    DBCollection dbCollection = db.getCollection("scenario");
    scenarioCollection = JacksonDBCollection.wrap(dbCollection, Scenario.class, String.class);
}

public void update(Scenario scenario) {
    WriteResult<Scenario, String> writeResult = scenarioCollection.updateById(scenario._id, scenario);
    if (writeResult.getError() != null) throw new RuntimeException(writeResult.getError());
}

public String saveNewScenario(Scenario scenario) {
    WriteResult<Scenario, String> writeResult = scenarioCollection.insert(scenario);
    if (writeResult.getError() != null) throw new RuntimeException(writeResult.getError());
    return writeResult.getSavedId();
}


public Scenario getScenario(String id) {
    return scenarioCollection.findOneById(id);
}
}

显示失败的测试:

package no.nils.mongoupdate;

import java.net.UnknownHostException;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import org.junit.Before;
import org.junit.Test;
import com.mongodb.DB;
import com.mongodb.MongoClient;

public class ScenarioStorageTest {

private ScenarioStorage storage;

@Before
public void createDb() throws UnknownHostException {
    MongoClient mongoClient = new MongoClient("localhost", 27017);
    DB db = mongoClient.getDB("junittest");
    storage = new ScenarioStorage(db);
}

@Test
public void shouldUpdateNameAfterUpdate() {
    Scenario scenario = new Scenario("first");
    final String id = storage.saveNewScenario(scenario);
    scenario._id = id;
    scenario.name = "newname";
    storage.update(scenario);
    Scenario updated = storage.getScenario(id);
    assertNotNull("Stored object should have been fetched.", updated.name);
    assertEquals("The stored object should now have the name 'newname'.", updated.name, "newname");
}
}

测试在第一个断言上失败。如果我误解了 mongojack 的 javadoc 或我可能犯的任何其他错误,请告知。

最佳答案

好的,javadoc 和教程已损坏。解决办法是在_id字段添加注解@ObjectId。

@ObjectId
public String _id;

关于java - MongoJack 和 updateById 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25718772/

相关文章:

XML 中的 Java 变量

java - j2ee 和 ADFS 之间的集成

java - 如何使用 .net 代码执行 Amazon Cloud Search?

node.js - Mongoose 多文档交易不起作用

java - 无法使用 mongo 和 mongojack 反序列化 localdatetime

java - 在类中的 jlabel 中设置文本

javascript - 在 MongoDB 中,为什么搜索不存在的电子邮件会使我的整个应用程序崩溃

java - 如何使用java远程连接到我的服务器中的MongoDB?

java - "com.fasterxml.jackson.databind.JsonMappingException: Expected type float, integer, or string."使用 ObjectMapper 转换 java.time.Instant

java - MongoJack 未找到对象