Обновление индекса в mongodb - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть следующий индекс в моей коллекции:

{
    "v" : 1,
    "key" : {
        "story_feed_id" : 1,
        "story_guid" : 1
    },
    "unique" : true,
    "ns" : "newsblur.stories",
    "name" : "story_feed_id_1_story_guid_1",
    "background" : false,
    "dropDups" : false
},

, и я хочу, чтобы он обновлял dropDups, чтобы быть истинным

Каков наилучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

Нет действительного варианта использования, где вам нужно было бы включить этот флаг. Вызов createIndex / sureIndex, который приведет к определению индекса в вашем сообщении, завершится ошибкой, если в этой коллекции будут присутствовать дубликаты ключей индекса:

> db.test.save({a:1})
> db.test.save({a:1})
> db.test.ensureIndex({a:1}, {unique:true})
E11000 duplicate key error index: test.test.$a_1  dup key: { : 1.0 }

Другими словами, не существует ситуации, когда вам нужно включить этот флаг задним числом. Единственная причина, по которой этот флаг существует, заключается в удалении дубликатов при вызове createIndex для коллекций, имеющих повторяющиеся значения ключа индекса, и вы хотите удалить их, а не вызов, завершившийся ошибкой с указанной выше ошибкой.

0 голосов
/ 20 апреля 2015

, если вы не можете удалить, просто удалите дубликаты с помощью следующего кода (Node.js)

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');

// Connection URL
var url = 'mongodb://localhost:27017/videossite';
// Use connect method to connect to the Server
MongoClient.connect(url, function(err, db) {
  assert.equal(null, err);
  console.log("Connected correctly to server");
   var collection = db.collection("video");

  collection.aggregate([
    { $group: {
      // Group by fields to match on (a,b)
      _id: { videoId: "$videoId" },

      // Count number of matching docs for the group
      count: { $sum:  1 },

      // Save the _id for matching docs
      docs: { $push: "$_id" }
    }},

    // Limit results to duplicates (more than 1 match)
    { $match: {
      count: { $gt : 1 }
    }}

],function(err,result){

    for(var i = 0 ; i < result.length ; i++){

      collection.remove({videoId:result[i]._id.videoId},function(err, result) {
        console.log("result",result.result.n)

      });
    }

  });

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...