Trong cách tiếp cận đầu tiên của bạn, bạn không thể lập chỉ mục các trường id, vì id được sử dụng làm khóa. Loại hoạt động của nó giống như từ điển giá trị khóa. Cách tiếp cận này hữu ích nếu bạn có tập hợp id đã biết (tất nhiên là số lượng ít hơn).
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
vì vậy để tìm các giá trị cho trường id idk73716, bạn có thể thực hiện việc này bằng cách
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
{} trống biểu thị truy vấn và phần thứ hai {'lines.idk73716':1} là bộ chọn truy vấn.
có id làm khóa có lợi thế khi chỉ chọn một trường cụ thể. Mặc dù {'lines.idk73716':1} là một bộ chọn trường, ở đây nó đóng vai trò như một truy vấn và bộ chọn. nhưng điều này không thể được thực hiện trong cách tiếp cận thứ hai của bạn. Giả sử tập hợp thứ hai giống như thế này
> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
>
Và bạn đã lập chỉ mục id trường, vì vậy nếu bạn muốn truy vấn theo id
> db.second_collection.find({'lines.id' : 'idk73716' })
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
>
bằng cách xem kết quả ở trên, có thể thấy rằng không có cách nào để chọn các tài liệu phụ (nhúng) phù hợp một mình, nhưng có thể thực hiện được trong cách tiếp cận đầu tiên. Đây là hành vi mặc định của mongodb.
xem
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
sẽ tìm nạp tất cả các dòng, không chỉ idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
Hy vọng điều này sẽ giúp
CHỈNH SỬA
Cảm ơn @Gates VP để chỉ ra
Chúng tôi vẫn có thể sử dụng $ being để truy vấn id, nhưng nó sẽ không thể lập chỉ mục được