programing

Mongoose 객체의 중첩 배열에서 고유 값

closeapi 2023. 5. 1. 21:23
반응형

Mongoose 객체의 중첩 배열에서 고유 값

프로젝트를 위해 다음과 같은 조직 그룹에 대한 mongoose 문서를 보관하고 싶습니다.

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

동일한 사용자가 같은 그룹에 두 번 포함되지 않도록 합니다.이렇게 하려면 users.uid가 users 배열에서 고유하도록 해야 합니다.uid에 대해 'unique: true'라고 말하려 했지만 소용이 없었습니다.추가 쿼리나 스키마 분할 없이 mongoose 또는 mongoDB로 이를 수행할 수 있는 방법이 있습니까?

편집: uid의 이전 값을 uid: {type: Schema로 변경했습니다.Types.ObjectId, ref: 'User', 인덱스: {unique: true, dropDups: true}} 그래도 작동하지 않는 것 같습니다.

편집: 이를 위한 간단한 방법이 없다고 가정하여 사용자가 이미 그룹에 있는지 확인하는 추가 쿼리를 추가했습니다.이것이 제게는 가장 간단한 방법인 것 같습니다.

배열 필드의 고유 색인은 집합에 있는 둘 이상의 문서 배열에 동일한 값이 나타날 수 없도록 하지만, 단일 문서 배열에 동일한 값이 두 번 이상 나타나는 것을 방지하지는 않습니다.따라서 배열에 요소를 추가할 때 고유성을 보장해야 합니다.

값이 아직 없는 경우에만 연산자를 사용하여 배열에 값을 추가합니다.

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

하지만, 만약에users어레이에는 여러 속성을 가진 개체가 포함되어 있으며 그 중 하나에 대해서만 고유성을 보장하려는 경우uid이 경우), 다른 접근 방식을 취해야 합니다.

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

그것이 하는 일은 자격을 부여하는 것입니다.$push다음 경우에만 발생하도록 업데이트user.uid에 이미 존재하지 않습니다.uid의 요소 중 하나의 필드users그래서 흉내를 냅니다.$addToSet행동, 하지만 그냥.uid.

음, 이것은 오래된 질문일 수 있지만 몽구스 > v4.1의 경우, 당신은 사용할 수 있습니다.$addToSet교환입니다.

$addToSet 연산자는 값이 이미 존재하지 않는 한 배열에 값을 추가합니다. 이 경우 $addToSet은 해당 배열에 아무 것도 하지 않습니다.

예:

MyModal.update(
   { _id: 1 },
   { $addToSet: {letters: [ "c", "d" ] } }
)

언급URL : https://stackoverflow.com/questions/15921700/mongoose-unique-values-in-nested-array-of-objects

반응형