Ошибка дублирующегося ключа E11000 с MongoDB / Mongoose - PullRequest
0 голосов
/ 02 мая 2018

У меня есть схема модели пользователя, схема рабочей модели и схема критической модели. Связь между этими схемами заключается в том, что пользователь может отправлять много работ (например, посты в блоге) и может комментировать / просматривать (которые мы называем критикой) посты (работы) других людей.

Так что, когда пользователь отправляет критику (воспринимает ее как обзор), это мой пост. Я нахожу работу по идентификатору, затем создаю новый объект модели критики и передаю ее функции .create () mongoose. Все идет хорошо, пока я не достигну линии foundWork.critiques.push(createdCritique). ошибки в журнале консоли:

BulkWriteError: Коллекция ошибок повторяющегося ключа E11000: индекс zapper.critiques: дублирующий ключ username_1: {: null}

Очевидно, это говорит о том, что в объектах есть два ключа имени пользователя, и они конфликтуют друг с другом, но я недостаточно знаком с этим, чтобы найти корень проблемы и устранить ее в моделях мангустов. Модели ниже. Если бы кто-нибудь мог помочь, это было бы очень признательно.

// post route for getting the review
router.post('/:id', isLoggedIn, function(req, res) {

    Work.findById(req.params.id, function(err, foundWork) {
        if (err) {
            console.log(err);
        } else {

            // create a new critique
            var newCritique = new Critique ({
                reviewerName: {
                    id: req.user._id,
                    username: req.user.username
                },
                work: {
                    id: foundWork._id,
                    title: foundWork.title
                },
                critique : req.body.critique,
                date: Date.now(),
                rating: 0
            });

            // save new critique to db
            Critique.create(newCritique, function(err, createdCritique) {
                if (err) {
                    console.log(err)
                } else {
                    console.log("Created critique is ");
                    console.log(createdCritique);

                    // push the new critique into array of critiques of the work
                    foundWork.critiques.push(createdCritique);
                    // save to db
                    foundWork.save();                                
                }
            });
        }
    });

Модель пользователя:

var mongoose = require('mongoose');
var passportLocalMongoose = require('passport-local-mongoose');

var UserSchema = new mongoose.Schema({
    firstname: String,
    lastname: String,
    username: String,
    password: String,
    email: String,
    zip: String,
    bio: {
        type: String,
        default: ''
    },
    influences: {
        type: String,
        default: ''
    },
    favBooks: {
        type: String,
        default: ''
    },
    notWriting: {
        type: String,
        default: ''
    },
    favHero: {
        type: String,
        default: ''
    },
    favVillain: {
        type: String,
        default: ''
    },
    works: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Work'
        }
    ],
    critiques: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Critique'
        }
    ],
    friends: [
        {
            friendId: String,
            friendName  : String,
            friendPic: String
        }
    ],
    friendRequests: [
        {
            sendingFriendId: String,
            sendingFriendName  : String,
            sendingFriendPic: String
        }
    ],
    createdDate: {
        type: Date,
        default: Date.now
    },
    lastLogin: {
        type: Date,
        default: Date.now
    }
});

UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", UserSchema);

Рабочая модель:

var mongoose = require('mongoose');

var WorkSchema = new mongoose.Schema({
    title: String,
    genre: String,
    workType: String,
    length: Number,
    ageRange: String,
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
        username: String
    },
    manuscriptText: String,
    critiques: [ 
        {
            id: {
                type: mongoose.Schema.Types.ObjectId,
                ref: "Critique"
            }
        }
    ],
    ratingNumber: [Number],
    ratingSum: {
        type: Number,
        default: 0
    },
    date: {
        type: Date,
        default: Date.now
    },
    isPublic: {
        type: Boolean,
        default: true
    }
});


module.exports = mongoose.model("Work", WorkSchema);

Модель критики:

var mongoose = require('mongoose');
var passportLocalMongoose = require('passport-local-mongoose');

var CritiqueSchema = new mongoose.Schema({
    reviewerName: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
        username: String
    },
    work: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "Work"
        },
        title: String
    },
    critique: String,
    date: {
        type: Date,
        default: Date.now
    },
    rating: [Number]
});


CritiqueSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("Critique", CritiqueSchema);

1 Ответ

0 голосов
/ 08 мая 2018

Когда вы создаете уникальный индекс в MongoDB, поведение по умолчанию таково, что он также будет индексировать нулевые значения.

Это означает, что если в вашей коллекции есть документ с именем пользователя, равным нулю, вы не можете добавить другой документ с именем пользователя, равным нулю.

Вам нужно разреженный индекс , который индексирует только фактические значения (и игнорирует документы с нулевым значением для этого поля).

Проверьте эту ссылку Показывает, как создать разреженный индекс по сравнению с "нормальным" индексом в mongoose (индекс: true, против spare: true). В большинстве случаев вам нужны разреженные индексы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...