Miễn là bạn nhận ra rằng bạn đang khớp trên ObjectId và không thực sự là bất kỳ thứ gì trong bộ sưu tập được tham chiếu, bạn có thể sử dụng $in
nhà điều hành:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Tất nhiên, đó là các giá trị ObjectId thực tế của bạn.
Nhưng nếu bạn thực sự muốn nói đến một tài liệu có chính xác mảng đó, thì bạn chỉ cần chuyển vào mảng:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
Và nếu nó phải có cả hai phần tử nhưng có thể có những phần tử khác thì hiện tại bạn cần sử dụng $and
biểu thức:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Nhưng từ bản phát hành 2.6, bạn có thể sử dụng đúng cách $all
để làm điều tương tự một cách hiệu quả:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
Dạng còn lại chỉ khớp với hai yếu tố đó, nhưng theo bất kỳ thứ tự nào. Vì vậy, có hai cách tiếp cận:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Điều này sử dụng một $or
hợp lý
để nói rằng mảng phải chính xác nhưng có thể được sắp xếp theo một trong hai cách. Và cách tiếp cận khác:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Vì vậy, điều này sẽ sử dụng $size
để đảm bảo rằng khi mảng chứa cả hai phần tử phù hợp cũng chỉ có hai các yếu tố. Cú pháp nào đẹp hơn là sử dụng $or
, đặc biệt là đối với các mảng lớn hơn.
Và trong các bản phát hành trong tương lai như đã đề cập, điều này thậm chí còn rõ ràng hơn:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
Điều đó bao hàm khá nhiều mọi cách diễn giải