Java 基本CDB对象更新重复同一文档

Java 基本CDB对象更新重复同一文档,java,mongodb,updates,upsert,Java,Mongodb,Updates,Upsert,我对api java mongodb有一个大问题。我使用DBCollection类的更新方法请求,在mongodb中,我得到一个多个相同的文档,而值不变,请帮助我。我不想有重复的文件 BasicDBObject query = new BasicDBObject(); query.append("ad", "man2ist").append("list.id", new BasicDBObject("$ne", "5")); // "list.id" : {$ne : 0 } BasicDB

我对api java mongodb有一个大问题。我使用DBCollection类的更新方法请求,在mongodb中,我得到一个多个相同的文档,而值不变,请帮助我。我不想有重复的文件

BasicDBObject query = new BasicDBObject();
query.append("ad", "man2ist").append("list.id", new BasicDBObject("$ne", "5")); //  "list.id" : {$ne : 0 }

BasicDBObject a = new BasicDBObject("id",String.valueOf(5)).append("value", 100);
BasicDBObject upd = new BasicDBObject("$addToSet",new BasicDBObject("list",a));
System.out.println(query);

System.out.println(upd);

WriteResult r = dbc.update(query,upd,true,false);

//db.friends.update({ "ad" : "man2ist" , "list.id" : { $ne : "4"} },{ $addToSet : { "list" : { "id" : "4","value" : 100}}},true,true);
我的文件如下:

{
"ad" : "man2ist",
"createdDate" : ISODate(),
"list" : [
        {
                "id" : "45",
                "value" : 489
        },
        {
                "id" : "5",
                "value" : 20,

        },
        {
               "id" : "4578",

                "value" : 21,

        } ]}

问题是,您将颠覆标志设置为true,这意味着如果找不到符合条件的文档,则应创建文档。如果数据库中没有与条件匹配的文档,mongo shell也会这样做

如果将查询更改为此

WriteResult r = dbc.update(query,upd,false,false);

它应该可以一直工作。

你能解释一下你想做什么以及你收藏的文档是什么样子吗?终端中有mongo shell,这是可行的,但是使用mongo java驱动程序,当我使用upsert选项更新文档时,我会得到一个重复的文档。也许这是JavaMongo驱动程序中的一个bug,但它并不正常。我想更新我的文档,如果已经存在,我不创建,但我更新了他,如果他不存在,我创建了他,谢谢。在查找java驱动程序中可能存在的错误(未排除)之前,您能用简单的英语解释一下您要更新的文档吗。我指的是文件应满足更新的条件。有时问题只是输入了错误的操作符,尤其是当你的操作使用一个驱动程序而不是另一个驱动程序时。对于文档外观,我在第一篇文章中更新了他,还有我的mongo请求:db.friends.update({ad:“man2ist”,“list.id”:{$ne:“5”},{$addToSet:{“list”:{'id':“5”,'value:'100},true,false);. 在mongo shell中,一切都可以正常工作,但在java中则不行。上面我有一个json文档,如果我想更新他,我会得到两个相同的文档,具有不同的oid(object_id)。我觉得它找不到该文档,因此它会创建另一个文档是的,但如果该文档不存在,mongo不会创建。此外,我的搜索标准是正确的,正如您所看到的(“ad”:“man2ist”),但我觉得它无法识别。我想说的是,它与mongo shell完美配合。我已经尝试过了,如果不存在符合条件的文档,甚至mongo shell也会创建一个新的文档。根据你的标准,一切都是正确的。也许您应该在空集合中尝试查询以查看。将集合名称更改为不存在的friendstest,并再次在mongo shell中运行该命令以查看。db.friendstest.update({ad:“man2ist”,“list.id”:{$ne:“5”},{$addToSet:{“list”:{'id':“5”,'value':100}}},true,false)。之后,集合friendstest将有一个新文档。如果我在查询中使用mongo shell,其中upsert选项为false,并且集合为空,它将为我创建一个文档。如果文档存在,它会让我更新数据。在java中,如果我在一个空集合上重复使用同一个查询,那么什么也不会发生,我被迫打开upsert选项,但是会出现重复文档的问题。我想我将分两个阶段进行,首先是创建文档,然后插入第二个更新,使用upsert和update to false。我使用mongodb的jongo java框架,一切都很好,我发现shell的操作也一样,谢谢。