Как создать уникальные ключи в 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