2012-02-05 20 views
5

Cho phép nói rằng tôi có một bộ sưu tập trong mongodb có đối tượng có một mảng lồng nhau. Tôi muốn sắp xếp dựa trên giá trị của một phần tử cụ thể của mảng. Điều này có thể không?Tôi có thể sắp xếp theo một phần tử trong một mảng lồng nhau trong Mongo không?

Ví dụ (và tôi vừa làm ví dụ), nếu tôi có bộ sưu tập các loại phim (hành động, hài kịch, lãng mạn) và các ví dụ do người dùng gửi, tôi có thể tìm thấy tất cả các đối tượng mà người dùng đã gửi được sắp xếp theo ngày của bộ phim?

Ví dụ: tôi muốn tìm tất cả các loại mà 'Aaron' gửi ví dụ, được sắp xếp theo năm của ví dụ 'Aaron' được gửi.

Nó gần giống như một mệnh đề cần ở đâu trong sắp xếp.

> db.movies.find(). Pretty();

{ 
    "_id" : ObjectId("4f2f07c1ec2cb81a269362c6"), 
    "type" : "action", 
    "examples" : [ 
     { 
      "title" : "Gladiator", 
      "year" : 2000, 
      "submitter" : "Aaron" 
     }, 
     { 
      "title" : "Mission Impossiple", 
      "year" : 1996, 
      "submitter" : "Bill" 
     }, 
     { 
      "title" : "The Terminator", 
      "year" : 1984, 
      "submitter" : "Jane" 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("4f2f07edaee5d897ea09f511"), 
    "type" : "comedy", 
    "examples" : [ 
     { 
      "title" : "The Hangover", 
      "year" : 2009, 
      "submitter" : "Aaron" 
     }, 
     { 
      "title" : "Dogma", 
      "year" : 1999, 
      "submitter" : "Bill" 
     }, 
     { 
      "tile" : "Airplane", 
      "year" : 1980, 
      "submitter" : "Jane" 
     } 
    ] 
} 

> db.movies.find ({ 'examples.submitter': 'Aaron'}) phân loại.. ({ 'Examples.year': 1}) khá();

{ 
    "_id" : ObjectId("4f2f07edaee5d897ea09f511"), 
    "type" : "comedy", 
    "examples" : [ 
     { 
      "title" : "The Hangover", 
      "year" : 2009, 
      "submitter" : "Aaron" 
     }, 
     { 
      "title" : "Dogma", 
      "year" : 1999, 
      "submitter" : "Bill" 
     }, 
     { 
      "tile" : "Airplane", 
      "year" : 1980, 
      "submitter" : "Jane" 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("4f2f07c1ec2cb81a269362c6"), 
    "type" : "action", 
    "examples" : [ 
     { 
      "title" : "Gladiator", 
      "year" : 2000, 
      "submitter" : "Aaron" 
     }, 
     { 
      "title" : "Mission Impossiple", 
      "year" : 1996, 
      "submitter" : "Bill" 
     }, 
     { 
      "title" : "The Terminator", 
      "year" : 1984, 
      "submitter" : "Jane" 
     } 
    ] 
} 

Lưu ý các tài liệu được trả về được sắp xếp theo năm bộ sưu tập (như dự kiến) - bất kỳ cách nào để sắp xếp theo chỉ những được gửi bởi một người dùng nào đó? cho một số chi tiết thêm Tôi đang sử dụng trình điều khiển mongo nút gốc cho nodejs.

Trả lời

5

... bất kỳ cách nào để sắp xếp theo chỉ những người được một người dùng nhất định gửi?

Tôi không nghĩ rằng việc này sẽ hiệu quả theo cách bạn muốn.

Trong MongoDB, truy vấn trả về toàn bộ tài liệu. Khi bạn thực hiện truy vấn sau, bạn đang tìm tất cả các tài liệu mà bất kỳ người gửi nào khớp với 'Aaron'.

> db.movies.find({'examples.submitter': 'Aaron'}) 

Lưu ý rằng 'Aaron' về mặt lý thuyết có thể khớp hai lần trong cùng một tài liệu nhưng chỉ trả lại tài liệu đó một lần. Điều này làm phức tạp vấn đề phân loại.

> db.movies.find({'examples.submitter': 'Aaron'}).sort({'examples.year': 1}) 

Vì vậy, bạn mong đợi điều gì khi một tài liệu chứa hai thứ bởi 'Aaron' với các năm khác nhau? Hãy nhớ rằng chúng ta chỉ có thể sắp xếp các tài liệu, chúng ta không thể sắp xếp mảng bên trong với truy vấn.

Vấn đề ở đây là bạn đang sử dụng "mảng đối tượng" làm phức tạp toàn bộ quá trình. Câu hỏi phân loại của bạn giả định rằng chúng ta có thể hành động trên các vật thể bên trong và chúng ta thực sự không thể.

Vui lòng xem Aggregation Framework mới có thể cung cấp những gì bạn đang tìm kiếm. Lưu ý rằng đây hiện là một tính năng trong nhánh không ổn định.

+0

Tôi không nghĩ mình có thể làm được nhưng nhận thấy nó đáng để quay. Tôi rất vui vì tôi đã đưa nó lên như Khung kết hợp mà bạn đề cập có vẻ như nó có thể giúp tôi có một khi đã sẵn sàng/ổn định. Cảm ơn! – Zugwalt

0

Đối với trường hợp của bạn, bạn sẽ phải sử dụng eval và thực hiện phân loại tùy chỉnh trên server side. Hãy xem here để biết ví dụ cụ thể về sắp xếp. Hàm so sánh của bạn sẽ phức tạp hơn một chút, vì bạn sẽ phải đi qua mảng "ví dụ" và lọc theo người gửi.

1

Trong trường hợp bất cứ ai tình cờ khác trên này, tôi đã có thể để giải quyết một vấn đề tương tự bằng cách tạo ra một chỉ số như:

{'examples.submitter': 1, 'examples.year': 1} 

Nếu bạn buộc truy vấn của bạn để sử dụng chỉ số này sử dụng gợi ý ("indexname"), kết quả của bạn sẽ trở lại theo thứ tự của chỉ mục.

+0

Bạn có thể giải thích thêm về nơi bạn đặt tệp đó/cách hoạt động không? Tôi cũng đang đấu tranh với một vấn đề rất giống với một vấn đề ở đây. – ritmatter

+1

Bạn cần sử dụng .ensureIndex trên bộ sưu tập của mình. Bạn thường làm điều này với một id mongo db hoặc trên dòng lệnh. http://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/ Đối với gợi ý bạn có thể sử dụng mongodb http://docs.mongodb.org/manual/reference/operator/meta/hint/ hoặc với mongoose sử dụng chức năng gợi ý trên truy vấn của bạn. query.hint ({indexA: 1, indexB: -1}) –

Các vấn đề liên quan