Lưu ý lệnh vài dòng dưới đây trong tài liệu bạn đã liên kết:
Điều này cho bạn biết rằng các trường không tồn tại và các trường được đặt thành null sẽ được xử lý đặc biệt.
Để các tài liệu {}
và {a: null}
để tương đương theo thứ tự sắp xếp, thuật toán sắp xếp phải xem xét trường sắp xếp bị thiếu sẽ có mặt và có giá trị null
.
Nếu bạn thêm trường bị thiếu một cách rõ ràng, chỉ để xem nó trông như thế nào, thứ tự sẽ có ý nghĩa hơn.
Bộ lọc {tag: { $gte: { baz: MinKey() }}}
áp dụng cho {_id: 1, tag: {bar: "BAR"}}
về cơ bản là so sánh {baz: MinKey()}
với {baz: null, bar: "BAR"}
.
Gần đầu tài liệu mà bạn đã liên kết có ghi rằng MinKey
nhỏ hơn null
, vì vậy đó là thứ tự thích hợp.
CHỈNH SỬA
Nói chung, truy vấn hiệu quả nhất khi bản thân tên trường không phải là dữ liệu. Về cơ sở dữ liệu dạng bảng, cột nào sẽ chứa "baz"?
Một thay đổi nhỏ trong lược đồ sẽ đơn giản hóa loại truy vấn này. Thay vì {tagname: tagvalue}
, sử dụng {k:tagname, v:tagvalue}
. Sau đó, bạn có thể lập chỉ mục tag.k
và / hoặc tag.v
và truy vấn trên tag.k
để tìm tất cả các tài liệu có thẻ "baz", việc truy vấn thẻ bằng các phép toán bất đẳng thức sẽ hoạt động trực quan hơn.
db.collection.find({"tag.k":{$gte:"baz"}})
Đối sánh chính xác có thể được thực hiện với elemMatch như
db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})
Nếu bạn thực sự cần các tài liệu trả về chứa {tagname: tagvalue}
, $arrayToObject
toán tử tổng hợp có thể làm điều đó:
db.collection.aggregate([
{$match: {
"tag.k": {$gte: "baz"}
}},
{
$addFields: {
tag: {$arrayToObject: [["$tag"]]}
}}
])