Почему дубликаты сохраняются, даже если я использую составной индекс? Mongo (Мангуст)

#node.js #mongodb #mongoose #mongoose-schema

#node.js #mongodb #мангуст #мангуст-схема

Вопрос:

Я пытаюсь сохранить координаты щелчка в базе данных, но если x и y совпадают, я не хочу их сохранять. Даже если я использую составной индекс и делаю все по книге, это все равно сохраняет все. Аналогичный вопрос есть в stackoverflow, но он не работает для моего кода.

Модель, схема:

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

Может ли быть так, что все записи хранятся в массиве, и, насколько я знаю, индекс позволяет хранить дубликаты в массиве? Если это проблема, то как мне сохранить уникальные объекты в массиве.

Комментарии:

1. Может ли быть так, что все записи хранятся в массиве, и, насколько я знаю, индекс позволяет хранить дубликаты в массиве?

Ответ №1:

Вы индексируете x amp; y , в то время как поля являются clicks.x amp; clicks.y . Если вы пытаетесь добавить уникальные значения в массив, почему бы не использовать addToSet ?

Комментарии:

1. Спасибо, у меня это сработало. Вы знаете, как вызвать функцию в случае, если значение уже существует?