Java驱动程序:如何使用Mongodb的updateFirst方法获取更新对象的objectId

Sim*_*mon 10 java mongodb

我正在尝试获取已更新的对象的objectId - 这是我使用java驱动程序的java代码:

    Query query = new Query();
    query.addCriteria(Criteria.where("color").is("pink"));
    Update update = new Update();
    update.set("name", name);
    WriteResult writeResult = mongoTemplate.updateFirst(query, update, Colors.class);

    Log.e("object id", writeResult.getUpsertedId().toString());
Run Code Online (Sandbox Code Playgroud)

日志消息返回null.我在mongolab上使用mongo服务器3.0,因为我在免费套餐上,所以它不应该返回null.我的mongo shell也是:

MongoDB shell版本:3.0.7

有没有一种简单的方法可以返回我刚更新的文档的对象ID?如果我不能返回upsertedId,方法getUpsertedId()有什么意义?

为了做我想做的事,我目前必须发出两个非常麻烦的查询:

    //1st query - updating the object first
    Query query = new Query();
    query.addCriteria(Criteria.where("color").is("pink"));
    Update update = new Update();
    update.set("name", name);
    WriteResult writeResult = mongoTemplate.updateFirst(query, update, Colors.class);
    //2nd query - find the object so that I can get its objectid
    Query queryColor = new Query();
    queryColor.addCriteria(Criteria.where("color").is("pink"));
    queryColor.addCriteria(Criteria.where("name").is(name));
    Color color = mongoTemplate.findOne(queryColor, Color.class);
    Log.e("ColorId", color.getId());
Run Code Online (Sandbox Code Playgroud)

根据David的回答,我甚至尝试过他的建议,而不是在模板上使用upsert,所以我将代码更改为下面的代码,但它仍然不起作用:

    Query query = new Query();
    query.addCriteria(Criteria.where("color").is("pink"));
    Update update = new Update();
    update.set("name", name);
    WriteResult writeResult = mongoTemplate.upsert(query, update, Colors.class);

    Log.e("object id", writeResult.getUpsertedId().toString());
Run Code Online (Sandbox Code Playgroud)

Sar*_*air 6

西蒙,我认为它可以在一个查询中实现.你需要的是一个叫做findAndModify()的不同方法.

在mongoDB的java驱动程序中,它有一个名为findOneAndUpdate(filter,update,options)的方法.

此方法返回已更新的文档.根据您为方法指定的选项,这可以是更新前的文档,也可以是更新后的文档.如果没有文档与查询过滤器匹配,则返回null.它不需要传递选项,在这种情况下,它将返回在应用更新操作之前更新的文档.

快速浏览一下mongoTemplate java驱动文档:http://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/FindAndModifyOptions.html 告诉我你可以使用方法调用:

public <T> T findAndModify(Query query,
                           Update update,
                           FindAndModifyOptions options,
                           Class<T> entityClass)
Run Code Online (Sandbox Code Playgroud)

如果在查询中找不到该项,您还可以更改FindAndModifyOptions类以进行"upsert".如果找到该对象,则只需修改该对象.