node.js - How to create a persistent unique index in MongoDB -



node.js - How to create a persistent unique index in MongoDB -

disclaimer : i'm using mongoose less 48h.

i have model looks :

var mongoose = require('mongoose'); var schema = mongoose.schema; //schema definition var categoryschema = new schema({ name: string, url: { type: [string], index: true }, extra: array, frequency: number, last_processed: date }); // model definition var category = mongoose.model('categories', categoryschema);

when app launches, has method automatically update collection, using js file structured next (js file not under control):

var categories = { retailer: 'ret1', name: 'c1', url: 'url1', extra: ['tag1'], frequency: 2, last_processed: '' }, { retailer: 'ret2', name: 'c2', url: 'url2', extra: ['tag2'], frequency: 2, last_processed: '' }, ........ ]; module.exports = categories;

i create records using loop :

var category = mongoose.model('categories'); (var j = 0; j < categories.length; j++) { new category(categories[j]).save(); }

my problem next :

when launch app first time, db.categories.count()= 308 (as should be). if close app , relaunch however, count()=616, duplicates records. thought using index avoid behaviour, apparently not. documentation on indexes isn't clear me, coming rdb background. see in debug index created : mongoose: categories.ensureindex({ url: 1 }) { safe: undefined, background: true }

how can create persistent unique index on collection never have duplicates? after simple startup routine, writing on table constantly, have recreate index after each write?

update after more research :

i have no duplicates in 308 urls write , start empty db.

you can define index unique:

var categoryschema = new schema({ name: string, url: { type: string, index: { unique: true } }, extra: array, frequency: number, last_processed: date });

then, given add together callback save()

for (var j = 0; j < categories.length; j++) { new category(categories[j]).save(function(err, doc) { console.error(err); }); }

you see next printed

{ [mongoerror: insertdocument :: caused :: 11000 e11000 duplicate key error index: test.categories.$url_1 dup key: { : "url2" }] name: 'mongoerror', code: 11000, err: 'insertdocument :: caused :: 11000 e11000 duplicate key error index: test.categories.$url_1 dup key: { : "url2" }' }

you can utilize findoneandupdate which, given alternative upsert: true, either create or update object. if don't want update skip because category exists using save() enough.

for (var j = 0; j < categories.length; j++) { category.findoneandupdate( { url: categories[j].url }, categories[j], { upsert: true }, function(err, doc) { console.error(err); } ); }

node.js mongodb mongoose

Comments

Popular posts from this blog

formatting - SAS SQL Datepart function returning odd values -

c++ - Apple Mach-O Linker Error(Duplicate Symbols For Architecture armv7) -

php - Yii 2: Unable to find a class into the extension 'yii2-admin' -