我正在尝试获取已更新的对象的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());
西蒙,我认为有可能在一个查询中实现。您需要的是另一个名为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'。如果找到该项目,则该对象将被修改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句