2016-01-07 49 views
11

我正在建在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 } 
}); 

我試圖讓道模型獨特根據貓鼬文檔:

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 [文字]第二個實例-1,[文字] -2等

我需要能夠查詢使用一個特定的詞所有句子,所以我每個單詞真的需要一個項目。但對於我的生活,我無法弄清楚如何創造一個獨特的領域。

有可能我的問題是,當我從路由添加一個新的Word負責接受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只會更新現有的唯一字段?

回答

3

我只能通過使用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(); 
3

你需要改變你的模型是這樣的add方法:

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

我嘗試過了,我的工作,請注意,我加入獨特:真正

我使用創造了一個梯形項目自耕農的梯形發電機,並創建了一個模型,像你這樣的(你可以找到它的模型/ 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

+0

我仍然越來越多當我直接查看Mongo數據庫時,查找同一個詞的條目。如果我將兩個相同的單詞相加,即使在模型中使用了「{unique:true}」,「_id」也會變成「[單詞] -1」。我也看到這個錯誤:'{[CastError:Cast to ObjectId失敗的值'{word:'sleek'}「在路徑」word「]' –

+0

實際上,Cast到ObjectId是不相關的,但是甚至如果我使用_id的默認ObjectId,則設置'unique:true'仍然會生成一個新條目 –