Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java驱动程序:如何使用Mongodb';s updateFirst方法_Java_Mongodb - Fatal编程技术网

Java驱动程序:如何使用Mongodb';s updateFirst方法

Java驱动程序:如何使用Mongodb';s updateFirst方法,java,mongodb,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.update

我正在尝试获取已更新对象的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 server 3.0,因为我在免费层,所以它不应该返回null。我的mongo shell也是:

MongoDB外壳版本: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());

Upsert仅在两种情况下适用

  • 更新选项已在上插入
  • 实际上创建了一个新文档 您的查询既没有启用upsert,也没有创建新文档。因此,
    getUpsertedId()
    在这里返回null是非常合理的

    不幸的是,用当前的API在一次调用中不可能得到您想要的;你需要把它分成两个电话。Mongo shell API进一步说明了这一点:

    upsert插入的文档的_id仅当 向上插入将导致插入。


    西蒙,我认为一个查询就可以实现。您需要的是另一个名为的方法

    在mongoDB的java驱动程序中,它有一个名为的方法

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

    在这里快速查看mongoTemplate java驱动程序文档:告诉我您可以使用方法调用:

    public <T> T findAndModify(Query query,
                               Update update,
                               FindAndModifyOptions options,
                               Class<T> entityClass)
    
    public T查找和修改(查询、,
    更新,
    FindModifyOptions选项,
    类(实体类)
    

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

    这是使用Scala中的findOneAndUpdate(筛选、更新、选项)执行此操作的示例:

    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)
    

    你好,David,即使我使用了以下方法:WriteResult WriteResult=mongoTemplate.upsert(查询、更新、颜色.class);然后尝试获取带有getUpsertedId()的id,它仍然不会返回id。@Simon听起来您好像在一个已经存在的文档上运行upsert,所以这是有意义的。见第2点。尝试进行查询
    query.addCriteria(Criteria.where(“color”).is(“adasdasa”)但在第1点中,您说过更新选项已打开。在我的例子中,mongoTemplate已经打开了upsert,所以它应该可以工作……而且您上面建议的代码也没有意义,因为这样我就必须创建一个新文档。我不是在创建新文档,而是通过upsert修改现有文档,否则,我可以轻松地进行保存,并通过mongoTemplate.save方法获取id。@Simon我想你误解了,条件1和2都必须是真的。我还将更新以澄清,upsert的要点是,只有当您正在搜索的文档不存在时,才会发生这种情况,然后您将创建一个新文档。否则,它只是一个定期更新。正如您所说,您只是在修改一个现有的文档,因此不会执行upsert,也不会返回upsertId。好的-理解,但仍需要考虑一下。在我的情况下,我不能使用save方法,因为这可能会导致重复的文档,我认为这两个方法调用是最好的选择,除非我收到这个问题的任何其他答案。如果有一个例子,这将是一个很好的答案;)@马库斯谢谢你,我自己也不是一个喜欢java的人。如果你知道代码,你能编辑答案吗?我认为在理论上这是可行的,但我不是100%确定,因为我最近没有时间测试它。我认为java中的方法调用应该是findAndModify: