web-dev-qa-db-ja.com

スキーマキーが一意のMongooseの複製

そのコレクション全体で重要なプロジェクトを一意にしたいのですが、これを機能させることはできません。ここで同様の問題を見つけました。

task.js

function make(Schema, mongoose) {

    var Tasks = new Schema({
        project: { type: String, index: { unique: true, dropDups: true }},
        description: String
    });

    mongoose.model('Task', Tasks);
}
module.exports.make = make;

test.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/rss');

var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectId;

require('./task.js').make(Schema, mongoose);
var Task = mongoose.model('Task');
var newTask = new Task({
    project: 'Starting new project'
  , description: 'New project in node'
});
newTask.save(function(err) {
    if (err) console.log('Error on saving');
});

mongoose.disconnect();

ノードtest.jsでアプリを実行すると、まだ複製が作成されます。

MongoDB Shell version: 2.0.2
connecting to: rss
> db.tasks.find()
> db.tasks.find()
{ "project" : "Starting new project", "description" : "New project in node", "_id" : ObjectId("4f21aaa3d48d4e1533000001") }
{ "project" : "Starting new project", "description" : "New project in node", "_id" : ObjectId("4f21aaa4d9a8921a33000001") }
{ "project" : "Starting new project", "description" : "New project in node", "_id" : ObjectId("4f21aaa57ebeea1f33000001") }

//同じ問題を編集します。db.tasks.drop()コレクションを削除しようとしました。mongoを再起動します。sudoはmongodbを停止し、mongodbを起動し、プログラムを再度実行しました。

22
Risto Novik

「一意の」属性を「インデックス」属性にネストしているため、渡すスキーマオブジェクトは正しく機能しない場合があります。次のようなものを試してください(意図したとおりに機能します)。

User = mongoose.model('User', new Schema({
    firstName:  {
        type:String,
        required: true,
    },
    lastName: {
        type:String,
        required: true,
    },
    email: {
        type:String,
        required: true,
        unique: true
    },
    address: String,
    phone: {
        type:String,
        required: true,
    },
    password:  {
        type:String,
        required: true,
        set: Data.prototype.saltySha1 // some function called before saving the data
    },
    role: String
},{strict: true}));

または、より具体的にあなたの例:

var Tasks = new Schema({
    project: { 
        type: String, 
        unique: true,
        index: true
    },
    description: String
});

注:「dropDups」パラメーターを使用して何をしようとしているのかわかりません。 mongoose documentation にはないようです。

30
Arnaud Rinquin