在mongodb中更新索引

时间:2011-12-16 18:38:01

标签: mongodb indexing nosql

我的收藏品上有以下索引:

{
    "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更新为true

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:3)

没有有效的用例需要启用该标志。如果在该集合中存在索引键的重复项,那么将导致帖子中的索引定义的createIndex / ensureIndex调用将失败:

> 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调用删除重复项,并且您希望删除它们而不是因上述错误而导致调用失败。

答案 1 :(得分:0)

如果你不能删除只需删除下一个代码(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)

      });
    }

  });

});
&#13;
&#13;
&#13;