2015-01-13 29 views
6

Tôi có một tập hợp các đối tượng mong muốn lồng nhau và tôi muốn đếm số lượng các tài liệu phụ phù hợp với một điều kiện nhất định Chỉnh sửa: (trong mỗi tài liệu). Ví dụ:MongoDB tập hợp đối tượng lồng nhau đếm

{"_id":{"chr":"20","pos":"14371","ref":"A","alt":"G"}, 
"studies":[ 
    { 
     "study_id":"Study1", 
     "samples":[ 
      { 
       "sample_id":"NA00001", 
       "formatdata":[ 
        {"GT":"1|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      }, 
      { 
       "sample_id":"NA00002", 
       "formatdata":[ 
        {"GT":"0|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      } 
     ] 
    } 
] 
} 
{"_id":{"chr":"20","pos":"14372","ref":"T","alt":"AA"}, 
"studies":[ 
    { 
     "study_id":"Study3", 
     "samples":[ 
      { 
       "sample_id":"SAMPLE1", 
       "formatdata":[ 
        {"GT":"1|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      }, 
      { 
       "sample_id":"SAMPLE2", 
       "formatdata":[ 
        {"GT":"1|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      } 
     ] 
    } 
] 
} 
{"_id":{"chr":"20","pos":"14373","ref":"C","alt":"A"}, 
"studies":[ 
    { 
     "study_id":"Study3", 
     "samples":[ 
      { 
       "sample_id":"SAMPLE3", 
       "formatdata":[ 
        {"GT":"0|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      }, 
      { 
       "sample_id":"SAMPLE7", 
       "formatdata":[ 
        {"GT":"0|0","GQ":48,"DP":8,"HQ":[51,51]} 
       ] 
      } 
     ] 
    } 
] 
} 

Tôi muốn biết có bao nhiêu tài liệu phụ chứa GT: "1 | 0", mà trong trường hợp này sẽ là 1 trong những tài liệu đầu tiên, và hai trong lần thứ hai, và 0 trong 3rd. Tôi đã thử các chức năng thư giãn và tổng hợp nhưng tôi rõ ràng là không làm điều gì đó chính xác. Khi tôi cố gắng đếm các văn bản dưới bởi trường "GT", Mongo phàn nàn:

db.collection.aggregate([{$group: {"$studies.samples.formatdata.GT":1,_id:0}}]) 

kể từ khi tên nhóm tôi không thể chứa, nhưng nếu tôi rời chúng ra "":

db.collection.aggregate([{$group: {"$GT":1,_id:0}}]) 

nó than phiền vì "$ GT không thể là tên nhà điều hành"

Bất kỳ ý tưởng nào?

Trả lời

14

Bạn cần phải xử lý $unwind khi làm việc với mảng, và bạn cần phải làm điều này ba lần:

db.collection.aggregate([ 

    // Un-wind the array's to access filtering 
    { "$unwind": "$studies" }, 
    { "$unwind": "$studies.samples" }, 
    { "$unwind": "$studies.samples.formdata" }, 

    // Group results to obtain the matched count per key 
    { "$group": { 
     "_id": "$studies.samples.formdata.GT", 
     "count": { "$sum": 1 } 
    }} 
]) 

Lý tưởng nhất là bạn muốn lọc đầu vào của bạn. Có thể thực hiện việc này với một số $match cả trước và sau khi thư giãn $ được xử lý và sử dụng $regex để khớp các tài liệu nơi dữ liệu tại điểm bắt đầu bằng "1".

db.collection.aggregate([ 

    // Match first to exclude documents where this is not present in any array member 
    { "$match": { "studies.samples.formdata.GT": /^1/ } }, 

    // Un-wind the array's to access filtering 
    { "$unwind": "$studies" }, 
    { "$unwind": "$studies.samples" }, 
    { "$unwind": "$studies.samples.formdata" }, 

    // Match to filter 
    { "$match": { "studies.samples.formdata.GT": /^1/ } }, 

    // Group results to obtain the matched count per key 
    { "$group": { 
     "_id": { 
       "_id": "$_id", 
       "key": "$studies.samples.formdata.GT" 
     }, 
     "count": { "$sum": 1 } 
    }} 
]) 

Lưu ý rằng trong tất cả các trường hợp, tiền tố "$ $" là "biến" đề cập đến thuộc tính của tài liệu. Đây là "giá trị" để sử dụng đầu vào ở bên phải. Các "phím" bên trái phải được chỉ định làm khóa chuỗi đơn giản. Không có biến nào có thể được sử dụng để đặt tên cho một khóa.

+1

Có, tính năng này hoạt động, nhưng nó thực sự tính tất cả các giá trị trong bộ sưu tập, thay vì tài liệu. Những gì tôi đang tìm kiếm là tương đương với việc đếm các tài liệu phụ trong mỗi tài liệu, bao gồm nếu có 0. Tôi sẽ sửa bài viết gốc của tôi để làm cho điều này rõ ràng hơn. –

+0

@StevenHart Điều đó không rõ ràng trong câu hỏi của bạn. Nhưng đó là một vấn đề đơn giản bao gồm id tài liệu trong khóa nhóm. Xem thay đổi. –

+0

Đây có phải là trận đấu $ thứ hai cần thiết sau khi $ thư giãn không? – TheGaff

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