tl; dr
Có, có thể có nhiều tài liệu với một trường được đặt thành null
hoặ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
string
hoặc object
khi không null
).
Nếu bạn không quan tâm đến chi tiết, vui lòng bỏ qua implementation
phầ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
$eq
toán tử),
$exists: true
biểu hiện,
$gt
, $gte
, $lt
, $lte
Biể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 $type
biể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 email
trường trong ví dụ dưới đây chấp nhận một trong hai giá trị string
hoặc, giả sử binary data
, một $type
biể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 null
email 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.