2015-05-14 19 views
6

vì vậy tôi có một loạt các văn bản đơn giản nhưMongoDB tổng kích thước của các lĩnh vực mảng

{ 

    "foos": [ 
    ObjectId("5105862f2b5e30877c685c58"), 
    ObjectId("5105862f2b5e30877c685c57"), 
    ObjectId("5105862f2b5e30877c685c56"), 
    ], 

    "typ": "Organisation", 

} 

và tôi muốn tìm hiểu kích thước tổng thể của liên foos các văn bản của kiểu "Tổ chức"

nên tôi có điều này truy vấn tổng hợp

db.profil.aggregate(
    [ 
    { 
    $match:{ 
    "typ":"Organisation" 
    } 
    }, 
     { 
     $project: { 
      fooos: { $size: "$foos" } 
     } 
     } 
    ] 
) 

này trả về số lượng của tất cả các foos cho mỗi tài liệu

thích:

{ "_id" : ObjectId("50e577602b5e05e74b38a6c8"), "foooos" : 1 } 
{ "_id" : ObjectId("51922170975a09f363e3eef5"), "foooos" : 3 } 
{ "_id" : ObjectId("51922170975a09f363e3eef8"), "foooos" : 2 } 
{ "_id" : ObjectId("5175441d975ae346a3a8dff2"), "foooos" : 0 } 
{ "_id" : ObjectId("5192216f975a09f363e3eee9"), "foooos" : 2 } 
{ "_id" : ObjectId("5192216f975a09f363e3eeeb"), "foooos" : 3 } 
{ "_id" : ObjectId("5192216f975a09f363e3eee4"), "foooos" : 2 } 
{ "_id" : ObjectId("5192216f975a09f363e3eee6"), "foooos" : 2 } 
{ "_id" : ObjectId("5192216f975a09f363e3eedb"), "foooos" : 2 } 
{ "_id" : ObjectId("51922174975a09f363e3ef4a"), "foooos" : 1 } 
{ "_id" : ObjectId("5192216f975a09f363e3eee1"), "foooos" : 1 } 
{ "_id" : ObjectId("5192216e975a09f363e3eed7"), "foooos" : 2 } 
{ "_id" : ObjectId("5192216f975a09f363e3eeee"), "foooos" : 3 } 

là có một số truy vấn sẽ trả lại số tóm tắt cho foos của tất cả các tài liệu?

i chơi arround với $ tiền nhưng không biết làm thế nào để kết hợp với truy vấn của tôi, tôi chỉ làm được lỗi cú pháp, nó sẽ được mát mẻ để biết nếu điều này là có thể

Trả lời

15

Bao gồm các đường ống dẫn giai đoạn $group điều hành sau khi $project bước như sau:

db.profil.aggregate([ 
    { 
     "$match":{ "typ": "Organisation" } 
    }, 
    { 
     "$project": { 
      "fooos": { "$size": "$foos" } 
     } 
    }, 
    { 
      "$group": { 
       "_id": null, 
       "count": { 
        "$sum": "$fooos" 
       } 
      } 
    } 
]) 

nhóm di chúc này tất cả các tài liệu đầu vào từ giai đoạn $project trước và áp dụng biểu thức ắc $sum trên các lĩnh vực fooos trong nhóm để có được tổng số (sử dụng ví dụ cuối cùng của bạn):

Output

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : null, 
      "count" : 24 
     } 
    ], 
    "ok" : 1 
} 
+0

Xin lưu ý rằng trường '_id' là không cần thiết. –

+0

@MarkusWMahlberg Cảm ơn bạn đã lưu ý điều đó. – chridam

+1

wow, cảm ơn rất nhiều nó hoạt động như một charme! tôi cần phải bao gồm '" foos ": {$ ne: null}' vào truy vấn đối sánh $ để đặt nó vào công việc –

6

Tôi biết đây là một câu hỏi cũ nhưng bạn có thể bỏ qua dự án hoàn toàn nếu bạn muốn, vậy làm thế nào về điều này?

db.profil.aggregate([ 
{ 
    "$match":{ "typ": "Organisation" } 
}, 
{ 
    "$group": 
    { 
     "_id": null, 
     "count": 
     { 
      "$sum": { "$size": "$foos" } 
     } 
    } 
}]) 

Sản lượng vẫn giữ nguyên và có vẻ như là (hơi) nhanh hơn.

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