2013-04-14 49 views
135

Tôi có một vấn đề khi truy vấn MongoDB với ký hiệu đối tượng lồng nhau:Cách truy vấn đối tượng lồng nhau?

db.messages.find({ headers : { From: "[email protected]" } }).count() 
0 
db.messages.find({ 'headers.From': "[email protected]" } ).count() 
5 

Tôi không thể nhìn thấy những gì tôi đang làm sai. Tôi hy vọng ký hiệu đối tượng lồng nhau để trả lại kết quả tương tự như truy vấn ký hiệu dấu chấm. Tôi đang ở đâu?

Trả lời

276

db.messages.find({ headers : { From: "[email protected]" } })

thắc mắc này cho các tài liệu nơi headersbằng{ From: ... }, ví dụ: không chứa các lĩnh vực khác.


db.messages.find({ 'headers.From': "[email protected]" } )

này chỉ nhìn vào lĩnh vực headers.From, không bị ảnh hưởng bởi các lĩnh vực khác chứa trong, hoặc mất tích từ, headers.


Dot-notation docs

+0

Có cách nào để thực hiện việc này mà không có dấu ngoặc kép xung quanh "tiêu đề.Từ" không? – trysis

+2

@trysis để làm gì? – shx2

+0

Tôi không biết, chỉ cần tự hỏi, và nghĩ rằng đôi khi nó có thể hữu ích. – trysis

16

Hai truy vấn cơ chế làm việc theo những cách khác nhau, như đề xuất trong the docs tại phần các tài liệu phụ:

Khi lĩnh vực này nắm giữ một tài liệu nhúng (ví dụ, subdocument) , bạn có thể chỉ định toàn bộ subdocument làm giá trị của một trường hoặc “tiếp cận” subdocument sử dụng ký hiệu dấu chấm, để chỉ định giá trị cho các trường riêng lẻ trong các tài liệu phụ subdocument:

Bình đẳng khớp trong tài liệu phụ chọn nếu tài liệu phụ khớp chính xác với subdocument đã chỉ định.


Trong ví dụ sau, truy vấn phù hợp với tất cả các tài liệu có giá trị của nhà sản xuất lĩnh vực là một subdocument chỉ chứa các lĩnh vực company với giá trị 'ABC123' và lĩnh vực address với giá trị '123 Street', theo thứ tự chính xác :

db.inventory.find({ 
    producer: { 
     company: 'ABC123', 
     address: '123 Street' 
    } 
}); 
+6

Tôi đã phát điên. Điều này dường như với tôi khá không nhất quán, bởi vì khi truy vấn các đối tượng, các thuộc tính trực tiếp của nó có thể được khớp với nhau theo thứ tự bất kỳ. – Capaj