我试图获取我更新的对象的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());
答案 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仅适用于
您的查询既未启用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