MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Lược đồ ưa thích MongoDB cho các tập hợp được nhúng. tài liệu so với mảng

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để sử dụng $ Slice a $ filter kết quả trong MongoDB?

  2. các truy vấn lồng nhau trong pymongo bằng cách sử dụng collection.find ()

  3. Lập mô hình cho lược đồ bạn bè trong mongoose?

  4. Kết nối MongoDB từ Ứng dụng dựa trên thiết bị di động hoặc trình duyệt

  5. MongoDB - Giải phóng mảng bằng cách sử dụng tính năng tổng hợp và loại bỏ các bản sao