Как создать уникальные ключи в KeystoneJS
Я работаю над сайтом, созданным в KeystoneJS, который позволяет пользователям публиковать слова и получать синонимы от других пользователей. Слова представляются как часть фразы или предложения, например "Кошка была [опасно] близка к постукиванию по стеклу".
Модель моего предложения выглядит следующим образом:
Sentence.add({
sentence: { type: Types.Text, required: true, initial: "New Sentence", index: true },
word: { type: Types.Relationship, ref: 'Word', required: true, index: true, unique: true, initial: true },
submitter: { type: Types.Relationship, ref: 'User', required: true, index: true, unique: true, initial: true },
source: { type: Types.Text },
createdAt: { type: Date, default: Date.now }
});
И я попытался сделать модель Word уникальной в соответствии с документами Mongoose:
var Word = new keystone.List('Word', {
map: { name: 'word' },
_id: { from: 'word', path: 'word', unique: true, fixed: false}
});
Word.add({
word: { type: Types.Text, required: true, initial: "New word", index: true }
});
Но если я проверю его, представив два предложения с одним и тем же словом, он просто сделает второй экземпляр этого слова с _id [word] -1, [word] -2 и т.д.
Мне нужно иметь возможность запрашивать все предложения, которые используют определенное слово, поэтому мне действительно нужен один элемент для каждого слова. Но для моей жизни я не могу понять, как сделать поле уникальным.
Возможно, моя проблема связана с тем, когда я добавляю новое слово с маршрута, ответственного за прием запросов AJAX:
var newWord = new Word.model({
word: req.body.word // read from the input box on the home page
});
newWord.save(function(err) {
if (err) {
console.error(err);
}
});
Но я думал, что .save
просто обновит существующее уникальное поле?
Ответы
Ответ 1
Я смог только обеспечить уникальность с помощью модуля mongoose-unique-validator:
var keystone = require('keystone');
var Types = keystone.Field.Types;
var uniqueValidator = require('mongoose-unique-validator');
var Word = new keystone.List('Word', {
map: { name: 'word' }
});
Word.add({
word: { type: Types.Text, index: true, unique: true }
});
Word.schema.plugin(uniqueValidator);
Word.defaultColumns = 'word';
Word.register();
Ответ 2
вам нужно изменить метод добавления вашей модели следующим образом:
Word.add({
word: { type: Types.Text, required: true, initial: "New word", index: true, unique: true }
});
Я попробовал и работал у меня, заметил, что добавил уникальный: true
Я создал трапецеидальный проект с использованием генератора Yeoman keystone и создал модель, подобную вашей (вы можете найти ее в модели /Test.js), а затем на странице администратора, когда я пытаюсь добавить одно и то же слово дважды, я получаю:
Error saving changes to Word 569b98f27b5786db1c367b7a:
{ [MongoError: E11000 duplicate key error collection: test_unique_field.words index: word_1 dup key: { : "test" }]
name: 'MongoError',
code: 11000,
err: 'E11000 duplicate key error collection: test_unique_field.words index: word_1 dup key: { : "test" }' }
это ссылка на репо, если вы хотите поиграть с ней: keystonejs_test_unique