2016-10-20 8 views
0

私はデータベース上でクリック座標を保存しようとしていますが、xとyが同じであれば、保存したくありません。複合インデックスを使って本を使ってすべてをやっても、それでもすべてが保存されます。 stackoverflowにも同様の質問がありますが、私のコードではうまくいきません。複合インデックスを使用しても重複が保存されるのはなぜですか? Mongo(Mongoose)

モデル、スキーマ:

var mongoose = require('mongoose'); 
var uniqueValidator = require('mongoose-unique-validator'); 
require('mongoose-double')(mongoose); 
var Schema = mongoose.Schema; 
var integerValidator = require('mongoose-integer'); 
var SchemaTypes = mongoose.Schema.Types; 

var clickPoint = new Schema({ 
    clicks: [ 
     { 
      x: { 
       type: SchemaTypes.Double 
      }, 
      y: { 
       type: SchemaTypes.Double 
      }, 
      value: { 
       type: Number, 
       integer: true 
      } 
     } 
    ] 
}); 

clickPoint.index({x: 1, y: 1}, {unique: true}); 

clickPoint.plugin(integerValidator); 
clickPoint.plugin(uniqueValidator); 

//export model... 
module.exports = mongoose.model("ClickPoint", clickPoint); 

モデルコントローラー:

var ClickPoint = require('../Models/point'); 

exports.addPoint = function (click) { 
    ClickPoint.findOne(function (err, data) { 
     if(!err) { 
      if(data) { 
       data.clicks.push({ 
        x: click.x, 
        y: click.y, 
        value: click.value 
       }); 
       data.save(); 
      } 
      else { 
       var entry = new ClickPoint({ 
        x: click.x, 
        y: click.y, 
        value: click.value 
       }); 

       entry.save(); 
      } 
     } 
    }) 
}; 

それはすべてのレコードを配列に格納されており、私の知る限りでは、インデックスがで重複を格納することができますということでしたアレイ?それが問題であれば、どのようにオブジェクトをアレイ内でユニークに保つことになりますか?

+0

すべてのレコードが配列に格納されていて、私の知る限りでは、インデックスは配列に重複を格納することができますか? – Octtavius

答えて

1

あなた指数x & yに、フィールドがclicks.x & clicks.yている間。ユニークな値を配列に追加しようとしている場合は、addToSetを使用してください。

+0

それは私のために働いてくれてありがとう。値がすでに存在する場合に備えて関数を呼び出す方法を知っていますか? – Octtavius

関連する問題