java mongodb 不等于_java – MongoDB:如果不存在则插入记录,如果存在则忽略

我有一系列MongoDB记录,如:

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

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

我会遇到可能会或可能不会属于同一个人的各种其他记录.如果他们是新人,我想接受他们,如果他们是我们以前见过的人,就不要更新他们.所以如果我得到{“name”:“Jim”,“gpa”:2},我想接受原样.如果我得到{“name”:“Sarah”,“gpa”:4}(不同的GPA值),我想忽略它.这似乎不是将“upsert”设置为yes或使用“upsert”的findAndModify进行更新的逻辑.

https://stackoverflow.com/a/3260290/514757建议一种方式(第一个字段上的唯一索引,插入记录,立即更新第二个字段)但它已经有几年了,我想知道现在没有更好的方法可以一步完成.

编辑:

接受的答案看起来很棒,但它对我不起作用!首先,我创建了索引(这是使用Java驱动程序):

nameIndex.put("name", 1);

nameIndex.put("unique", true);

queue.ensureIndex(nameIndex);

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

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 }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值