Вызывается: com.mongodb.MongoWriteException: E11000 Коллекция ошибок повторяющегося ключа: Blog.Posts index: id dup key: {: null} - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь загрузить исходные документы json в базу данных mongodb с помощью весенней загрузки.Во-первых, это схема документов mongodb.

@Document(collection="Posts") 
public class Post {

    @Id
    private String _id;

    @Indexed(unique = true) 
    private Long id; // This field is used for compatibility with Jpa Service interface

    private String title;

    private String body;

    private Date createdDate;

    @DBRef 
    private User user;

    @DBRef 
    private Collection<Tag> tags;
}

А нижеприведенные коды - это исходное содержимое файла json.

[ {
    "Post" : {
        "id" : 1,
        "title" : "Title 1",
        "created_date" : "2018-12-01 11:10:13.247",
        "body" : " 국회는 헌법 또는 ....",
        "user" : {
            "username" : "joseph",
            "password" : "password"
        },
        "tags" : {
            "tag" : [
                {
                    "id" : 1,
                    "created_Date" : "2018-12-02 11:10:13.247",
                    "body" : "첫 글의 댓글입니다.",
                    "user" : {
                        "username" : "jina",
                        "password" : "password"
                    }
                },{
                    "id" : 2,
                    "created_Date" : "2018-12-03 11:10:13.247",
            "body" : "첫 글의 두번째 댓글입니다.",
            "user" : {
                        "username" : "julian",
                        "password" : "password"
                    } } ] } }   
}
,
{
    "post" : {
        "id" : 2,
        "title" : "Title 2",
        "created_date" : "2018-12-03 11:10:13.247",
        "body" : "제안된 헌법개정안은 대통령이 ....",
        "user" : {
            "username" : "joseph",
            "password" : "password"
        },
        "tags" : {
            "tag" : [
                {
                    "id" : 1,
                    "created_Date" : "2018-12-02 11:10:13.247",
                    "body" : "댓글 입니다.",
                    "user" : {
                        "username" : "julian",
                        "password" : "password"
                    } } ] } }   
}]

И последние части - это функция, которая загружает вышеуказанный исходный файл json.в mongodb.

@Override
    public void loadInitDocuments(String file) {
        // TODO Auto-generated method stub
        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "EUC-KR"))) {
            String line;
            StringBuffer strBuffer = new StringBuffer();
            while ((line = br.readLine()) != null) {
                strBuffer.append(line+ "\n");
            }

            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
            TypeReference<List<Post>> typeReference = new TypeReference<List<Post>>(){};
            Collection<Post> posts = objectMapper.readValue(strBuffer.toString(), typeReference);
            System.out.println(posts.stream().collect(Collectors.toList()));

            if(postMongoRepository.count() == 0) {
                for(Post post : posts) {
                    postMongoRepository.save(post); // this line throws exception
                }
            }

            br.close();
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }

Но строка MongoRepository.save выдает исключение.

Caused by: com.mongodb.MongoWriteException: E11000 duplicate key error collection: Blog.Posts index: id dup key: { : null }
    at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:967)
    at com.mongodb.client.internal.MongoCollectionImpl.executeInsertOne(MongoCollectionImpl.java:494)
    at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:478)
    at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:472)
    at org.springframework.data.mongodb.core.MongoTemplate$6.doInCollection(MongoTemplate.java:1436)
    at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:538)

Я нашел причину с поиском в Google.Причина в том, что «если документ не имеет значения для индексированного поля в уникальном индексе, индекс будет хранить нулевое значение для этого документа. Из-за уникального ограничения MongoDB будет разрешать только один документ, в котором отсутствует индексированное поле."Но я понятия не имею, какая часть файла json имеет неправильное значение.

Отредактированная часть

На этот раз я столкнулся с проблемой с частью аннотации @Dbref.Ниже приведены коды документов пользователя,

@Document //
public class User {

    @Id //(2)
    private String _id;

    @Indexed(unique = true)
    private Long id;

    @Indexed(unique=true)
    private String username;

    private String password;
}

, а ниже - измененное исходное содержимое файла json.

[
    {
        "id" : 0,
        "title" : "Title 1",
        "created_date" : "2018-12-01 11:10:13.247",
        "body" : " 국회는 헌법 또는 법률에 ",
        "user" : {
            "id" : 0,
            "username" : "joseph",
            "password" : "password"
        },
        "tag" : [
            {
                "id" : 0,
                "created_Date" : "2018-12-02 11:10:13.247",
                "body" : "첫 글의 댓글입니다.",
                "user" : {
                    "id" : 1,
                    "username" : "jina",
                    "password" : "password"
                }
            },{
                "id" : 1,
                "created_Date" : "2018-12-03 11:10:13.247",
          "body" : "첫 글의 두번째 댓글입니다.",
          "user" : {
                "id" : 2,
                  "username" : "julian",
                  "password" : "password"
                }
            } ] }

,
  {
        "id" : 1,
        "title" : "Title 2",
        "created_date" : "2018-12-03 11:10:13.247",
        "body" : "제안된 헌법개정안은 대통령이 20",
        "user" : {
            "id" : 0,
            "username" : "joseph",
            "password" : "password"
        },
        "tag" : [
            {
                "id" : 0,
                "created_Date" : "2018-12-02 11:10:13.247",
                "body" : "댓글 입니다.",
                "user" : {
                    "id" : 2,
                    "username" : "julian",
                    "password" : "password"
                } } ] } 
]

Но документ user не связан с файлом json.Исключением является ...

Cannot create a reference to an object with a NULL id.
org.springframework.data.mapping.MappingException: Cannot create a reference to an object with a NULL id.
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.createDBRef(MappingMongoConverter.java:975)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal(MappingMongoConverter.java:597)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeAssociation(MappingMongoConverter.java:560)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeProperties(MappingMongoConverter.java:537)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:524)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:497)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:441)

User документ не связан с документом Post, поэтому он возвращает нулевое значение.Когда эта строка выполняется, она возвращает false

for(Post post : posts) {
  if(post.getUser().getId() == null)
    System.out.println("YES!! It is null");

  postMongoRepository.save(post);
}

1 Ответ

0 голосов
/ 28 февраля 2019

В вашем исходном файле json у вас есть массив из 2 документов, который имеет только одно корневое поле: «Опубликовать» для первого, «Опубликовать» для второго.Таким образом, сохранение первого документа приведет к id = null (так как определен Post.id, но не id).И то же самое со вторым выкинет ошибку ... Попробуйте заменить на, и она должна работать ...

[ {
        "id" : 1,
        "title" : "Title 1",
        "created_date" : "2018-12-01 11:10:13.247",
        "body" : " 국회는 헌법 또는 ....",
        "user" : {
            "username" : "joseph",
            "password" : "password"
        },
        "tags" : {
            "tag" : [
                {
                    "id" : 1,
                    "created_Date" : "2018-12-02 11:10:13.247",
                    "body" : "첫 글의 댓글입니다.",
                    "user" : {
                        "username" : "jina",
                        "password" : "password"
                    }
                },{
                    "id" : 2,
                    "created_Date" : "2018-12-03 11:10:13.247",
            "body" : "첫 글의 두번째 댓글입니다.",
            "user" : {
                        "username" : "julian",
                        "password" : "password"
                    } } ] }   
}
,
{

        "id" : 2,
        "title" : "Title 2",
        "created_date" : "2018-12-03 11:10:13.247",
        "body" : "제안된 헌법개정안은 대통령이 ....",
        "user" : {
            "username" : "joseph",
            "password" : "password"
        },
        "tags" : {
            "tag" : [
                {
                    "id" : 1,
                    "created_Date" : "2018-12-02 11:10:13.247",
                    "body" : "댓글 입니다.",
                    "user" : {
                        "username" : "julian",
                        "password" : "password"
                    } } ] }    
}]
...