Java MongoDB UpdateMany,带$in和upsert

Java MongoDB UpdateMany,带$in和upsert,java,mongodb,mongodb-query,mongodb-java,Java,Mongodb,Mongodb Query,Mongodb Java,名为persons1的Mongo集合包含以下数据: db.persons1.find().pretty(); { "_id" : "Sims", "count" : 32 } { "_id" : "Autumn", "count" : 35 } { "_id" : "Becker", "count" : 35 } { "_id" : "Cecile", "count" : 40 } { "_id" : "Poole", "count" : 32 } { "_id" : "Na

名为persons1的Mongo集合包含以下数据:

db.persons1.find().pretty();


{ "_id" : "Sims",    "count" : 32 }
{ "_id" : "Autumn",  "count" : 35 }
{ "_id" : "Becker",  "count" : 35 }
{ "_id" : "Cecile",  "count" : 40 }
{ "_id" : "Poole",   "count" : 32 }
{ "_id" : "Nanette", "count" : 31 }
现在,通过Java,我编写了增加列表中用户数量的代码

MongoClient mongoclient = new MongoClient("localhost", 27017);
MongoDatabase db = mongoclient.getDatabase("testdb1");
MongoCollection<Document> collection = db.getCollection("persons1");
List li = new ArrayList();
li.add("Sims");
li.add("Autumn");

collection.updateMany(
    in("_id",li),
    new Document("$inc", new Document("count", 1)),
    new UpdateOptions().upsert(true));
我的问题:对于数组列表中存在而persons1集合中不存在的条目,是否可以插入并从1开始计数

问题描述:

前程序数据库包含以下详细信息:

{ "_id" : "Sims",    "count" : 33 }
{ "_id" : "Autumn",  "count" : 36 }
{ "_id" : "Becker",  "count" : 35 }
{ "_id" : "Cecile",  "count" : 40 }
{ "_id" : "Poole",   "count" : 32 }
{ "_id" : "Nanette", "count" : 31 }
示例Java代码:

MongoClient mongoclient = new MongoClient("localhost", 27017);
MongoDatabase db = mongoclient.getDatabase("testdb1");
MongoCollection<Document> collection = db.getCollection("persons1");
List li = new ArrayList();

// Entry already Present so required to increment by 1
li.add("Sims");

// Entry already Present so required to increment by 1
li.add("Autumn");

// Entry is NOT Present, hence insert into persons data base with "_id" as User1 and count as 1
li.add("User1");

// Entry is NOT Present, hence insert into persons data base with "_id" as User1 and count as 1
li.add("User2");

// Code to be written
这里的“陷阱”是,
\u id
的参数不会被解释为“多”标记更新中
\u id
字段的有效“填充符”,这就是您正在执行的操作。默认情况下,所有
\u id
值将填充
ObjectId
值,而不是“upsert”

解决方法是使用“批量”操作,在Java 3.x驱动程序中使用
BulkWrite
类和如下结构:

    MongoCollection<Document> collection = db.getCollection("persons1");

    List li = new ArrayList();

    li.add("Sims");
    li.add("User2");

    List<WriteModel<Document>> updates = new ArrayList<WriteModel<Document>>();

    ListIterator listIterator = li.listIterator();

    while ( listIterator.hasNext() ) {
        updates.add(
            new UpdateOneModel<Document>(
                new Document("_id",listIterator.next()),
                new Document("$inc",new Document("count",1)),
                new UpdateOptions().upsert(true)
            )
        );
    }

    BulkWriteResult bulkWriteResult = collection.bulkWrite(updates);
MongoCollection collection=db.getCollection(“persons1”);
List li=new ArrayList();
li.添加(“SIM”);
li.添加(“用户2”);
列表更新=新建ArrayList();
ListIterator ListIterator=li.ListIterator();
while(listIterator.hasNext()){
更新。添加(
新的UpdateModel(
新文档(“\u id”,listIterator.next()),
新文件(“$inc”,新文件(“计数”,1)),
new UpdateOptions().upsert(true)
)
);
}
BulkWriteResult BulkWriteResult=collection.bulkWrite(更新);
它将您的基本
列表
操纵成具有适合的列表的对象,并且所有“单个”更新都在一个请求和一个响应中发送,即使它们“技术上”是多个更新语句


这是通过更新操作通过
$in
设置多个
\u id
键或匹配项的唯一有效方法。

据我所知,您建议的代码应该正确执行。那么,在结果中有什么对您不起作用呢?我的代码不会插入新id,作为更新的一部分,我只包含增量运算符..如何包含id的列表。因此,如果它在arraylist中找不到id,它将插入count作为一,但id是从mongo db内部生成的。这不可能是真的。1. <代码>\u id为“必填”,必须始终插入。2.您确实提供了一个列表和
.updateMany()
方法“wrapps”来暗示“multi”是一个参数。你也有“向上插入”。如果您认为您有不同之处,请显示结果,使其成为可复制的案例。collection.updateMany(in(“\u id”,li),new Document(“$inc”,new Document(“count”,1),append(“$set”,new Document(“\u id”,li))),new UpdateOptions().upsert(true));代码应该如上所述吗?在执行上述代码时遇到此问题…线程“main”java.lang中出现异常。UnsupportedOperationException@svsteja很抱歉
更新
对象列表时不正确地强制转换对象。坏习惯我没有检查。已修复。@Blakes Seven..谢谢..以上代码有效..是否可以使用spring数据实现相同的功能mongo@svsteja如果你有不同的问题。SpringMongo使用与MongoDB3.xJava驱动程序中引入的操作不同的操作,但是仍然可以使用相同的批量操作,尽管可以使用早期的驱动程序方法,也可以只使用SpringMongo更新方法而不使用批量操作。
{ "_id" : "Sims",    "count" : 34 } // Entry already Present, incremented by 1
{ "_id" : "Autumn",  "count" : 37 } // Entry already Present, incremented by 1
{ "_id" : "Becker",  "count" : 35 }
{ "_id" : "Cecile",  "count" : 40 }
{ "_id" : "Poole",   "count" : 32 }
{ "_id" : "Nanette", "count" : 31 }
{ "_id" : "User1",   "count" : 1 }  // Entry Not Present, start by 1
{ "_id" : "User2",   "count" : 1 }  // Entry Not Present, start by 1
    MongoCollection<Document> collection = db.getCollection("persons1");

    List li = new ArrayList();

    li.add("Sims");
    li.add("User2");

    List<WriteModel<Document>> updates = new ArrayList<WriteModel<Document>>();

    ListIterator listIterator = li.listIterator();

    while ( listIterator.hasNext() ) {
        updates.add(
            new UpdateOneModel<Document>(
                new Document("_id",listIterator.next()),
                new Document("$inc",new Document("count",1)),
                new UpdateOptions().upsert(true)
            )
        );
    }

    BulkWriteResult bulkWriteResult = collection.bulkWrite(updates);