복붙노트

[MONGODB] 몽구스 고유의 객체 중첩 배열의 값

MONGODB

몽구스 고유의 객체 중첩 배열의 값

내 프로젝트의 경우,이 같은 조직의 그룹에 대한 몽구스 문서를 유지하려면 :

var groupSchema = Schema({
  name : { type : String },
  org : { type : Schema.Types.ObjectId, ref : 'Organization' },
  ...
  users : [{
    uid : { type : Schema.Types.ObjectId, ref : 'User' },
    ...
  }]
});

나는 두 번 같은 그룹에있는에서 동일한 사용자를 방지 할 수 있습니다. 이렇게하려면, 나는 사용자의 배열에서 고유 할 users.uid 강제 할 필요가있다. 나는 독특한 : 사실 '라는 시도 UID에 대한,하지만 작동하지 않았다. 추가 쿼리 또는 분할하지 않고 몽구스 또는 MongoDB를 사용하여 스키마를이 할 수있는 방법이 있나요?

편집하다: 나는에 UID의 이전 값을 변경     UID : {유형 : Schema.Types.ObjectId, REF '사용자', 인덱스 : {독특한 : 사실, dropDups : TRUE}} 그러나 이것은 여전히 ​​작동하지 않습니다.

편집 : 사용자가 이미 그룹의 경우이를 달성하기 위해 간단한 방법이없는 가정, 나는 여분의 질의 검사를 추가했다. 이것은 가장 간단한 방법은 나에게 보인다.

해결법

  1. ==============================

    1.같은 값이 컬렉션에 더 이상의 문서의 배열에 나타나지 않을 수 있지만, 하나의 문서의 배열에 두 번 이상 나타나는 동일한 값을 방지하지 않는 배열 필드의 강제 시행에 고유 인덱스입니다. 당신은 당신이 대신 배열에 요소를 추가로 고유성 확인해야합니다 그래서.

    같은 값이 컬렉션에 더 이상의 문서의 배열에 나타나지 않을 수 있지만, 하나의 문서의 배열에 두 번 이상 나타나는 동일한 값을 방지하지 않는 배열 필드의 강제 시행에 고유 인덱스입니다. 당신은 당신이 대신 배열에 요소를 추가로 고유성 확인해야합니다 그래서.

    값이 존재하지 않는 경우에만 배열에 값을 추가하기 위해 $ addToSet 연산자를 사용합니다.

    Group.update({name: 'admin'}, {$addToSet: {users: userOid}}, ...
    

    사용자의 어레이는 여러 특성을 가진 개체를 포함하고 고유성 확인하려는 경우에는 이상 그 중 하나 (이 경우 UID)의, 당신은 다른 접근을해야합니다

    var user = { uid: userOid, ... };
    Group.update(
        {name: 'admin', 'users.uid': {$ne: user.uid}}, 
        {$push: {users: user}},
        function(err, numAffected) { ... });
    

    무슨하는 일은 user.uid 이미 사용자의 요소 중의 UID 필드에 존재하지 않는 경우에만 발생하도록 $ 푸시 업데이트를받을 수 있습니다. 그것을 모방 $ addToSet 동작하지만, 단지 UID에 대한 그래서.

  2. ==============================

    2.그런데이 오래된 질문이 될 수도 있지만 몽구스> 버전 4.1를 들어, $ addToSet 연산자를 사용할 수 있습니다.

    그런데이 오래된 질문이 될 수도 있지만 몽구스> 버전 4.1를 들어, $ addToSet 연산자를 사용할 수 있습니다.

    예:

    MyModal.update(
       { _id: 1 },
       { $addToSet: {letters: [ "c", "d" ] } }
    )
    
  3. from https://stackoverflow.com/questions/15921700/mongoose-unique-values-in-nested-array-of-objects by cc-by-sa and MIT license