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
'programing' 카테고리의 다른 글
Azure 웹 사이트 앱 설정 값을 읽는 방법 (0) | 2023.05.01 |
---|---|
UIViewController 위에 선명한 색상 UIViewController 표시 (0) | 2023.05.01 |
목록이 정렬되었는지 여부를 확인하는 Pythonic 방법 (0) | 2023.04.26 |
Java 컴파일러 수준이 설치된 Java 프로젝트 패싯의 버전과 일치하지 않습니다. (0) | 2023.04.26 |
Windows 배치 파일에서 무한 루프를 만드는 방법은 무엇입니까? (0) | 2023.04.26 |