2

私は次のことを試しました

db.Wall.ensureIndex({event_time : 1}, {unique: true})

しかし、この出力は表示され続けます

{
    "err" : "E11000 duplicate key error index: scrap.Wall.$event_time_1  dup key: { : new Date(0) }",
    "code" : 11000,
    "n" : 0,
    "connectionId" : 10,
    "ok" : 1
}

getIndexes を試しましたが、そこに event_time が表示されません

4

2 に答える 2

3

示されているように、重複する値を持つインデックスを作成することはできません。重複する値を見つける簡単な方法の 1 つは、次のような MongoDB シェルから集計クエリを使用することです。

db.Wall.aggregate([
       {$group : { _id: "$event_time" ,  count : { $sum: 1}}},
       {$match : { count : { $gt : 1 } }} ])

event_timeこれにより、複数のWallドキュメントに存在するすべての値のリストが返されます。

説明:

  1. event_time( _id: "$event_time")のグループ
  2. (一意の時間) のグループごとevent_timeに、カウントに 1 を追加します ( count: { $sum: 1})
  3. count次に、が 1 より大きいグループのみに一致します。

次に、問題がどの程度広がっているかを判断できます。以下に示すように、a に値をfind入力することで、すべてのマッチングを行うことができます。もちろん、まだインデックスが作成されていないため、超高速ではありません。:)event_timefind

db.Wall.find({ 'event_time' : /* one of the event times */ })

dropDupsもちろん、別の回答に示されているように、重複 ( ) を強制的に削除することもできます。ただし、インデックス作成フェーズで最初に見つかったドキュメントのみが保持され、他のドキュメントはすべて削除されるため、結果は非決定論的に見える場合があります。

于 2013-03-10T15:22:43.823 に答える
3

コレクション内のデータがwall機密でない場合は、次を呼び出すことができます。

db.Wall.ensureIndex({event_time : 1}, {unique: true, dropDups: true})

ただし、すべての重複は完全に削除されます。

于 2013-03-10T14:39:56.357 に答える