2011-09-14 40 views
26

Hãy nói rằng tôi có các tài liệu saumongoDB khác biệt và trong cùng một truy vấn?

Article { Comment: embedMany } 

Comment { Reply: embedMany } 

Reply { email: string, ip: string } 

Tôi muốn thực hiện một truy vấn mà chọn riêng biệt Reply.ip nơi Reply.email = xxx

Something như thế này, chỉ có nó không hoạt động ..

db.Article.find("Comment.Reply.email" : "xxx").distinct("Comment.Reply.ip") 

Xuất JSON:

{ 
    "_id":{ 
     "$oid":"4e71be36c6eed629c61cea2c" 
    }, 
    "name":"test", 
    "Comment":[ 
     { 
     "name":"comment test", 
     "Reply":[ 
      { 
       "ip":"192.168.2.1", 
       "email":"yyy" 
      }, 
      { 
       "ip":"127.0.0.1", 
       "email":"zzz" 
      } 
     ] 
     }, 
     { 
     "name":"comment 2 test", 
     "Reply":[ 
      { 
       "ip":"128.168.1.1", 
       "email":"xxx" 
      }, 
      { 
       "ip":"192.168.1.1", 
       "email":"xxx" 
      } 
     ] 
     } 
    ] 
} 

tôi chạy: db.Article.distinct("Comment.Reply.ip",{"Comment.Reply.email" : "xxx"})

Tôi hy vọng: ["128.168.1.1", "192.168.1.1"]

tôi nhận được: ["127.0.0.1", "128.168.1.1", "192.168.1.1", "192.168.2.1"]

+3

Có phiếu bầu tán thành của tôi đối với chữ "I chạy", "Tôi hy vọng "," Tôi nhận được ", nếu chỉ tất cả các câu hỏi được định dạng như thế này! – adelriosantiago

+1

Đây là một biến thể của giải pháp http://stackoverflow.com/a/13864518/358013 – blueskin

Trả lời

36

Distinct truy vấn trong Mongo với điều kiện làm việc như thế này

db.Article.distinct("Comment.Reply.ip",{"Comment.Reply.email" : "xxx"}) 

không cách khác xung quanh

EDIT:

Tôi hiểu vấn đề bây giờ, inorder để phù hợp/lọc các tài liệu phụ chúng ta cần phải sử dụng $ elemMatch điều hành, như thế này

db.Article.distinct("Comment.Reply.ip",{Comment: {$elemMatch: {"Reply.email" : "xxx"}}}) 

nhưng điều này sẽ không hoạt động nếu tài liệu phụ chứa các mảng phụ (trong trường hợp của bạn, bạn có mảng trả lời). Đã xảy ra sự cố hiện tại $elemMatch on subArray. Và kế hoạch của nó cho mongo 2.1. Bạn có thể kiểm tra các liên kết để biết thêm

+0

Tôi đã thử và dường như bỏ qua điều kiện, vì vậy kết quả giống như db.Article.distinct ("Comment.Reply.ip ") – Inoryy

+0

@Inori, ở trên mã hoạt động hoàn toàn tốt trong môi trường của tôi ... bạn có thể đăng dữ liệu thực tế của bạn và kết quả bạn có để tôi có thể tìm ... – RameshVel

+0

vui lòng kiểm tra cập nhật trong bài đăng đầu tiên – Inoryy

0

Có lẽ bạn có thể thử này

db.Article.aggregate([ 
{$unwind: "$Comment"}, 
{$unwind: "$Comment.Reply"}, 
{$match: {"Comment.Reply.email": "xxx"}}, 
{$group: {_id: "$Comment.Reply.ip"}} 
]) 

Kết quả của ví dụ nên

/* 1 */ 
{ 
    "_id" : "192.168.1.1" 
} 

/* 2 */ 
{ 
    "_id" : "128.168.1.1" 
} 
Các vấn đề liên quan