tl; dr
예, null
고유 한 "실제"값을 적용하면서 필드가로 설정 되거나 정의되지 않은 여러 문서를 가질 수 있습니다.
요구 사항 :
- MongoDB v3.2 이상.
- 구체적인 값 유형을 미리 알고 있어야합니다 (예 : 항상 a
string
또는 object
그렇지 않은 경우 null
).
세부 사항에 관심이 없으면 implementation
섹션 으로 건너 뛰어도됩니다 .
더 긴 버전
@Nolan의 답변을 보완하기 위해 MongoDB v3.2부터 필터 표현식과 함께 부분 고유 인덱스를 사용할 수 있습니다.
부분 필터 표현식에는 제한이 있습니다. 다음 만 포함 할 수 있습니다.
- 등식 (예 : 필드 : 값 또는
$eq
연산자 사용)
$exists: true
표현,
$gt
, $gte
, $lt
, $lte
표현,
$type
표현,
$and
최상위 수준에서만 연산자
이것은 사소한 표현이 {"yourField"{$ne: null}}
사용할 수 없음을 .
그러나 필드가 항상 동일한 유형을 사용 한다고 가정하면 $type
표현식을 사용할 수 있습니다 .
{ field: { $type: <BSON type number> | <String alias> } }
MongoDB v3.6은 배열로 전달할 수있는 여러 유형을 지정하기위한 지원을 추가했습니다.
{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }
이는 값이 아닌 경우 여러 유형 중 하나가 될 수 있음을 의미합니다 null
.
따라서 email
아래 예제 의 필드가 값 중 하나 string
또는 binary data
값 을 허용하도록 허용하려면 적절한 $type
표현식은 다음과 같습니다.
{email: {$type: ["string", "binData"]}}
이행
몽구스
몽구스 스키마에서 지정할 수 있습니다.
const UsersSchema = new Schema({
name: {type: String, trim: true, index: true, required: true},
email: {
type: String, trim: true, index: {
unique: true,
partialFilterExpression: {email: {$type: "string"}}
}
}
});
또는 컬렉션에 직접 추가합니다 (기본 node.js 드라이버 사용) :
User.collection.createIndex("email", {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
});
네이티브 mongodb 드라이버
사용 collection.createIndex
db.collection('users').createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
},
function (err, results) {
// ...
}
);
mongodb 쉘
사용 db.collection.createIndex
:
db.users.createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {$type: "string"}
}
})
이렇게하면 null
이메일을 포함하거나 이메일 필드없이 여러 레코드를 삽입 할 수 있지만 동일한 이메일 문자열 은 삽입 할 수 없습니다.