Tôi nghĩ rằng tôi đã tìm ra nó sau khi kiểm tra các tài liệu mongo. Về cơ bản, có là sự khác biệt về ngữ nghĩa giữa hai điều đó. Về cơ bản, ở dạng đầu tiên của truy vấn {c: {d: d1}}
, mongo giả định rằng bạn đang chỉ định toàn bộ subocument. Vì vậy, nếu bạn có tài liệu con {c: {d: d1, e: e1}}
, nó sẽ không khớp.
OTOH, dạng thứ hai của truy vấn {'c.d': d1}
ngụ ý rằng bạn chỉ xác định một kết quả phù hợp trên một trường trong tài liệu phụ. Điều này sẽ phù hợp ngay cả khi tiểu tài liệu có các trường khác hoặc toàn bộ tài liệu phụ.
Sự khác biệt này kéo dài đến chỉ mục. _ensureIndex({c: 1})
và _ensureIndex({'c.d': 1})
là hai chỉ mục khác nhau và mặc dù chỉ mục đầu tiên lập chỉ mục toàn bộ tài liệu con, nó sẽ không được sử dụng nếu bạn truy vấn trên một trường riêng lẻ với c.d
ký hiệu.