tl; dr
Có, có thể có nhiều tài liệu với một trường được đặt thành nullhoặc không được xác định, trong khi thực thi các giá trị "thực tế" duy nhất.
yêu cầu :
- MongoDB v3.2 +.
- Biết trước (các) loại giá trị cụ thể của bạn (ví dụ: luôn luôn là một
stringhoặc objectkhi không null).
Nếu bạn không quan tâm đến chi tiết, vui lòng bỏ qua implementationphần này.
phiên bản dài hơn
Để bổ sung câu trả lời của @ Nolan, bắt đầu với MongoDB v3.2, bạn có thể sử dụng chỉ mục duy nhất một phần với biểu thức bộ lọc.
Biểu thức bộ lọc từng phần có những hạn chế. Nó chỉ có thể bao gồm những điều sau:
- biểu thức bình đẳng (tức là trường: giá trị hoặc sử dụng
$eqtoán tử),
$exists: true biểu hiện,
$gt, $gte, $lt, $lteBiểu thức,
$type biểu thức,
$and chỉ ở cấp cao nhất
Điều này có nghĩa là {"yourField"{$ne: null}}không thể sử dụng biểu thức tầm thường .
Tuy nhiên, giả sử rằng trường của bạn luôn sử dụng cùng một kiểu , bạn có thể sử dụng một $typebiểu thức .
{ field: { $type: <BSON type number> | <String alias> } }
MongoDB v3.6 đã thêm hỗ trợ để chỉ định nhiều kiểu có thể có, có thể được chuyển dưới dạng một mảng:
{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }
có nghĩa là nó cho phép giá trị là bất kỳ trong số nhiều loại khi không null.
Do đó, nếu chúng ta muốn cho phép emailtrường trong ví dụ dưới đây chấp nhận một trong hai giá trị stringhoặc, giả sử binary data, một $typebiểu thức thích hợp sẽ là:
{email: {$type: ["string", "binData"]}}
thực hiện
cầy mangut
Bạn có thể chỉ định nó trong lược đồ mongoose:
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"}}
}
}
});
hoặc trực tiếp thêm nó vào bộ sưu tập (sử dụng trình điều khiển node.js gốc):
User.collection.createIndex("email", {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
});
trình điều khiển mongodb gốc
sử dụng collection.createIndex
db.collection('users').createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
},
function (err, results) {
// ...
}
);
vỏ mongodb
sử dụng db.collection.createIndex:
db.users.createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {$type: "string"}
}
})
Điều này sẽ cho phép chèn nhiều bản ghi với một nullemail hoặc hoàn toàn không có trường email, nhưng không phải với cùng một chuỗi email.