使用java mongo db驱动程序使用MongoDB插入时出现重复键错误

时间:2014-06-09 06:20:59

标签: java mongodb mongodb-java

尝试从JSON文件插入数据时出现此错误。只有一个项目被添加到数据库中。

  

11000 E11000 duplicate key error index: awdb.mycollection.$_id_  dup
> key: { : ObjectId('53954d897aadbe032a33cd68') }
  

> > db.mycollection.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "awdb.mycollection"
        },
        {
                "v" : 1,
                "unique" : true,
                "key" : {
                        "UDID" : 1
                },
                "name" : "UDID_1",
                "ns" : "awdb.mycollection",
                "sparse" : true
        }
]
>

以下是我正在使用的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 droid","sn":"abc12","ManDate":"12/12/1734"}

以下是用于插入JSON的代码

while ((sCurrentLine = br.readLine()) != null) {
d=g.fromJson(sCurrentLine, Device.class);
m.create(d);
}

这是我的创建功能

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;
    }

2 个答案:

答案 0 :(得分:1)

你需要这样做:

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;
    }

...

    }

答案 1 :(得分:0)

问题在于,正如@NeilLunn指出的那样,每次插入行时我都没有创建新的BasicDBObject。这意味着,它试图插入一个具有相同ObjectId的行,只更改了其余的值。这导致了上述错误。