Java驱动程序:如何使用Mongodb的updateFirst方法

时间:2015-11-14 19:59:42

标签: 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());

日志消息返回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());

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

3 个答案:

答案 0 :(得分:6)

Simon,我认为可以在一个查询中实现。您需要的是一种名为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)

如果在查询中找不到该项,您还可以将FindAndModifyOptions类更改为“upsert”。如果找到该对象,则只会修改该对象。

答案 1 :(得分:1)

Upsert仅适用于

  1. 更新选项已挂起
  2. 实际创建了一个新文档。
  3. 您的查询既未启用upsert,也未创建新文档。因此,getUpsertedId()在此处返回null是完全合理的。

    不幸的是,使用当前API在单个调用中无法获得所需内容;你需要把它分成两个电话。对于WriteResults

    的Mongo shell API进一步表明了这一点
      

    upsert插入的文档的_id。 仅在返回时返回   将插入结果插入。

答案 2 :(得分:0)

这是使用Scala中的findOneAndUpdate(过滤器,更新,选项)执行此操作的示例:

begin: 3
begin: 2
begin: 1
begin: 0
end: 0
end: 1
end: 2
end: 3
undefined