Java MongoDB:如果没有插入记录';不存在,如果存在则忽略

Java MongoDB:如果没有插入记录';不存在,如果存在则忽略,java,mongodb,upsert,Java,Mongodb,Upsert,我有一系列MongoDB记录,如: {“name”:“Bob”,“gpa”:4} {“name”:“Sarah”,“gpa”:3} 我将遇到可能或可能不属于同一个人的各种附加记录。如果他们是新人,我想接受他们,如果他们是我们以前见过的人,我不想更新他们。因此,如果我得到{“name”:“Jim”,“gpa”:2},我想接受它。如果我得到{“name”:“Sarah”,“gpa”:4}(不同的gpa值),我只想忽略它。这似乎不是update将“upsert”设置为yes的逻辑,也不是find和mo

我有一系列MongoDB记录,如:

{“name”:“Bob”,“gpa”:4}
{“name”:“Sarah”,“gpa”:3}

我将遇到可能或可能不属于同一个人的各种附加记录。如果他们是新人,我想接受他们,如果他们是我们以前见过的人,我不想更新他们。因此,如果我得到
{“name”:“Jim”,“gpa”:2}
,我想接受它。如果我得到
{“name”:“Sarah”,“gpa”:4}
(不同的gpa值),我只想忽略它。这似乎不是
update
将“upsert”设置为yes的逻辑,也不是
find和modify
将“upsert”设置为yes的逻辑

建议了一种方法(第一个字段上的唯一索引,插入记录,立即更新第二个字段),但它已经存在了几年,我想知道现在是否有更好的方法在一个步骤中实现这一点

编辑:

被接受的答案似乎很好,但它对我不起作用!首先,我创建了索引(使用Java驱动程序):

我可以从命令行看到索引存在并且是唯一的。然后,插入一个项目:

DBObject person = new BasicDBObject();
person.put("name", "Bob");
person.put("score", 200000);
queue.insert(person);
之后,得分最高的项目的得分降至零:

BasicDBObject reset = new BasicDBObject();
reset.put("$set", new BasicDBObject("score", 0));
DBObject dbObj = queue.findAndModify(null, new BasicDBObject("score", -1), reset);
所有这些都能如愿工作!但是,稍后,可能会再次找到相同的名称,并获得新的分数。当最后一段代码运行时,将创建一个具有不同分数的新项,这正是我不想要的:

BasicDBObject queueable = new BasicDBObject();
queueable.put("name", "Could be Bob again, could be someone new");
queueable.put("score", 1234);
queue.insert(queueable);
如果我搜索Bob,我会发现:

{ "_id" : ObjectId("4f5e865ad6d09315326ea0f0"), "score" : 0, "name" : "Bob" }
{ "_id" : ObjectId("4f5e8691d6d09315326ea190"), "name" : "Bob", "score" : 886 }

第二条记录已创建,分数再次较高。字段的顺序重要吗?似乎不应该这样,我不知道如何控制它。

实现这一点的最佳方法是使用以下命令在名称字段上设置唯一索引:

db.foo.ensureIndex({name:1}, {unique:true});
这将导致在进行insert调用时Sarah不会得到更新,因为它将找到另一条记录,其中已为名称字段设置了“Sarah”。

您的ensureIndex()调用不太正确。ensureIndex()的第一个参数包含应该索引的键;索引选项(如唯一性)可以作为第二个参数传递。看

现在,您正在尝试在两个字段上创建一个非唯一索引:“name”和“unique”

尝试以下操作以创建索引:

DBObject nameIndex=newBasicDBObject();
名称索引。放置(“名称”,1);
DBObject nameIndexOptions=新的BasicDBObject();
nameIndexOptions.put(“唯一”,true);
ensureIndex(nameIndex,nameIndexOptions);

谢谢,我不知道你可以在一个字段上保证这一点。奇怪的是,这不起作用。我在上面贴了一堆代码,希望有人能发现我的错误。我有一些问题。我想你没有设法解决它?字段的顺序并不重要。根据下面@tripvolpe的答案修复ensureIndex呼叫应该可以解决您的问题。如果有,请接受trip的回答。
db.foo.ensureIndex({name:1}, {unique:true});