2016-01-07 16 views
11

Tôi đang làm việc trên một trang web được xây dựng trong KeystoneJS cho phép người dùng đăng các từ và nhận các từ đồng nghĩa được đề xuất từ ​​những người dùng khác. Các từ được gửi như là một phần của cụm từ hoặc câu, như "Con mèo [nguy hiểm] gần gõ cửa kính."Cách tạo các khóa duy nhất trong KeystoneJS

mô hình Câu của tôi trông như thế này:

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

Và tôi đã cố gắng để làm cho mô hình Lời độc đáo theo tài liệu 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 } 
}); 

Nhưng nếu tôi kiểm tra nó bằng cách gửi hai câu với cùng một từ, nó chỉ tạo một ví dụ thứ hai của từ đó với _id [từ] -1, [từ] -2, v.v.

Tôi cần có khả năng truy vấn tất cả các câu sử dụng một từ cụ thể, vì vậy tôi thực sự cần một mục cho mỗi từ. Nhưng đối với cuộc sống của tôi, tôi không thể tìm ra cách làm cho một lĩnh vực độc đáo.

Có thể vấn đề của tôi là với khi tôi thêm một Word mới từ con đường chịu trách nhiệm về việc chấp nhận yêu cầu 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); 
    } 
}); 

Nhưng tôi nghĩ .save sẽ chỉ cập nhật một lĩnh vực độc đáo hiện tại?

Trả lời

3

Tôi chỉ có thể thực thi sự độc đáo bằng cách sử dụng các mô-đun mongoose-unique-validator như vậy:

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(); 
3

bạn cần thay đổi phương thức add của mô hình của bạn như thế này:

Word.add({ 
    word: { type: Types.Text, required: true, initial: "New word", index: true, unique: true } 
}); 

tôi đã cố gắng nó và làm việc cho tôi, thông báo tôi đã thêm độc đáo: true

tôi tạo ra một dự án yếu tố quyết định sử dụng máy phát điện keystone của yeoman, và tạo ra một mô hình giống như của bạn (bạn có thể tìm thấy nó trong mô hình/Test.js), sau đó trong trang quản trị khi tôi cố gắng thêm cùng một từ hai lần tôi nhận được:

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" }' } 

đây là liên kết tới các repo nếu bạn muốn chơi với nó: keystonejs_test_unique

+0

tôi vẫn nhận được nhiều các mục nhập cho cùng một từ khi tôi xem trực tiếp cơ sở dữ liệu Mongo. Nếu tôi thêm cùng một từ hai lần, '_id' sẽ trở thành" [word] -1 ", ngay cả với' {unique: true} 'trong mô hình. Tôi cũng thấy lỗi này mặc dù: '{[CastError: Truyền tới ObjectId không thành công cho giá trị" {word: 'sleek'} "tại đường dẫn" word "]' –

+0

Thực ra, 'Cast to ObjectId' không liên quan, nhưng thậm chí nếu tôi sử dụng ObjectId mặc định cho _id, thiết lập 'unique: true' vẫn tạo một mục mới –

Các vấn đề liên quan