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
Post a Comment