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



我正在尝试获取我更新的对象的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。我在mongoab上使用mongo服务器3.0,因为我在免费层,所以它不应该返回null。我的mongo外壳也是:

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的回答,我甚至尝试了他的建议,在模板上使用upstart,所以我把代码改为下面的代码,但它仍然不起作用:

    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());
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类以接受"upstart"。如果找到了,对象将被修改。

Upsert仅适用于两个

  1. 更新选项在
  2. 实际上创建了一个新文档

您的查询既没有启用追加销售,也没有创建新文档。因此,getUpsertedId()在这里返回null是完全合理的。

遗憾的是,使用当前的API不可能在一次调用中获得您想要的东西;你需要把它分成两个电话。WriteResults:的Mongo-shell API进一步表明了这一点

追加销售插入的文档的_id仅当追加销售导致插入

这是一个在Scala:中使用findOneAndUpdate(filter,update,options)的例子

val findOneAndUpdateOptions = new FindOneAndUpdateOptions
findOneAndUpdateOptions.returnDocument(ReturnDocument.AFTER)
val filter = Document.parse("{"idContrato":"12345"}")
val update = Document.parse("{ $set: {"descripcion": "New Description" } }")
val response = collection.findOneAndUpdate(filter,update,findOneAndUpdateOptions)
println(response)

最新更新