使用java mongo db驱动程序使用MongoDB插入时出现重复密钥错误
我在尝试从JSON文件插入数据时遇到此错误。只有一项被添加到数据库中 下面是我正在使用的JSON输入文件使用java mongo db驱动程序使用MongoDB插入时出现重复密钥错误,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我在尝试从JSON文件插入数据时遇到此错误。只有一项被添加到数据库中 下面是我正在使用的JSON输入文件 {"UDID":"1234","FriendlyName":"Ben Android","sn":"abc123","ManDate":"12/12/8234"} {"UDID":"1235","FriendlyName":"Android","sn":"abc23","ManDate":"12/12/1254"} {"UDID":"1236","FriendlyName":"Ben d
{"UDID":"1234","FriendlyName":"Ben Android","sn":"abc123","ManDate":"12/12/8234"}
{"UDID":"1235","FriendlyName":"Android","sn":"abc23","ManDate":"12/12/1254"}
{"UDID":"1236","FriendlyName":"Ben droid","sn":"abc12","ManDate":"12/12/1734"}
下面是我用来插入JSON的代码
while ((sCurrentLine = br.readLine()) != null) {
d=g.fromJson(sCurrentLine, Device.class);
m.create(d);
}
这是我的create函数
public boolean create(Device d) {
document.put("UDID",d.UDID);
document.put("name", d.FriendlyName);
document.put("Serial", d.sn);
document.put("Manf", d.ManDate);
collection.insert(document);
return true;
}
还有我的设备类
public class Device {
public String UDID;
public String FriendlyName;
public String sn;
public String ManDate;
}
问题是,正如@NeilLunn所指出的,我并不是每次插入一行时都创建一个新的
BasicDBObject
。这意味着,它试图插入一个具有相同ObjectId
的行,但只更改了其余的值。这导致了上述错误。您需要执行以下操作:
public boolean create(Device d) {
BasicDBObject document = new BasicDBObject();
document.put("UDID",d.UDID);
document.put("name", d.FriendlyName);
document.put("Serial", d.sn);
document.put("Manf", d.ManDate);
collection.insert(document);
return true;
}
然后,您将创建一个新对象以插入到集合中。希望这有帮助
编辑:在代码中使用getter和setter也是一种很好的做法,如下所示:
public class Device {
private String UDID;
private String FriendlyName;
private String sn;
private String ManDate;
public String getUDID(){
return this.UDID;
}
public String getFriendlyName(){
return this.FriendlyName;
}
public void setUDID(String UDID){
return UDID = this.UDID;
}
public String setManDate(String ManDate){
return ManDate = this.ManDate;
}
...
}
\u id
值是主键,不允许重复。您的JSON似乎至少两次提到了相同的值。您需要消除JSON的重复或以其他方式解决问题我已经用我的输入JSON更新了问题。我相信我们在这里看不到任何代码来确定任何不同。目前没有足够的信息供其他人解决您的问题。例如,document
在哪里被实例化?每个循环是否有一个新实例?或者它是在循环之外创建的,而您只是在替换这些值?看到这里可能出现的问题了吗?很可能它似乎包含一个未被覆盖的单数\u id
值。默认情况下在客户端上生成的。但我要说的是,这里没有相关的代码,任何人都可以肯定地告诉你。这显然是由于产生了错误。如果我们能看到代码,就更清楚了。
public boolean create(Device d) {
BasicDBObject document = new BasicDBObject();
document.put("UDID",d.UDID);
document.put("name", d.FriendlyName);
document.put("Serial", d.sn);
document.put("Manf", d.ManDate);
collection.insert(document);
return true;
}
public class Device {
private String UDID;
private String FriendlyName;
private String sn;
private String ManDate;
public String getUDID(){
return this.UDID;
}
public String getFriendlyName(){
return this.FriendlyName;
}
public void setUDID(String UDID){
return UDID = this.UDID;
}
public String setManDate(String ManDate){
return ManDate = this.ManDate;
}
...
}