4

MongoDBのマルチキーインデックスに問題があります。

、という名前のコレクションがusersあり、そのドキュメントは多かれ少なかれ次のようになります。

{
  "_id": ObjectId(),
  "name": "John Smith",
  ...
  "votes": [
    {
      "type": "news",
      "votedObjectId": "123"
    },
    {
      "type": "blog",
      "votedObjectId": "124"
    },
    {
      "type": "news"
      "votedObjectId": "225"
    }
  ]
}

にインデックスを作成し、votedObjectIdユーザーが記事ごとに1回だけ投票するようにします。

一意のインデックスを確保しました(コードはnode.jsにあります-mongoskinモジュール)

`this.ensureIndex({'votes.votedObjectId': 1}, {unique: true}, ...)`

次に、同じ記事に2回投票してみましたが、実際にはまったく同じ投票が2回追加されました。

配列に重複する要素が含まれないようにするにはどうすればよいですか?

PS

{safe:true}を使用してすべての挿入を実行します。取得した重複値は、挿入操作では返されませんが、実際にはコレクションに挿入されます。

4

2 に答える 2

10

{unique:true}は、オブジェクト間の一意性を保証するだけであり、配列内の配列要素の一意性を保証するものではありません。

しかし、mongodbのaddToSet機能をチェックしてください。

また、これは非常によく似た質問です。特定のフィールドに基づいて配列内の一意のアイテムを確保する方法-mongoDB?

于 2012-11-06T10:17:46.043 に答える
3

試す

this.ensureIndex({'votes.votedObjectId': 1, _id: 1}, {unique: true}, ...) 

またはで投票を処理する

this.update( 
  { _id:... , 'votes.votedObjectId':{$ne:'...'} }, 
  { $push: { votes: '...' }}
)

うまくいけば、これらのステートメントはあなたがそれを整理するのに役立つかもしれません。

于 2012-12-13T18:25:26.643 に答える