MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongodb tổng hợp trên subocument trong mảng

MapReduce chậm, nhưng nó có thể xử lý các tập dữ liệu rất lớn. Mặt khác, khung Tổng hợp nhanh hơn một chút, nhưng sẽ gặp khó khăn với khối lượng dữ liệu lớn.

Rắc rối với cấu trúc của bạn được hiển thị là bạn cần "$ unwind" các mảng để crack mở dữ liệu. Điều này có nghĩa là tạo một tài liệu mới cho mọi mục mảng và với khung tổng hợp, nó cần thực hiện việc này trong bộ nhớ. Vì vậy, nếu bạn có 1000 tài liệu với 100 phần tử mảng, nó sẽ cần phải xây dựng một luồng 100.000 tài liệu để nhómBy và đếm chúng.

Bạn có thể muốn xem xét liệu có một bố cục lược đồ sẽ phục vụ các truy vấn của bạn tốt hơn hay không, nhưng nếu bạn muốn làm điều đó với khung Tổng hợp thì đây là cách bạn có thể thực hiện (với một số dữ liệu mẫu để toàn bộ tập lệnh sẽ được đưa vào trình bao);

db.so.remove();
db.so.ensureIndex({ "items.sku": 1}, {unique:false});
db.so.insert([
    {
        _id: 42,
        last_modified: ISODate("2012-03-09T20:55:36Z"),
        status: 'active',
        items: [
            { sku: '00e8da9b', qty: 1, item_details: {} },
            { sku: '0ab42f88', qty: 4, item_details: {} },
            { sku: '0ab42f88', qty: 4, item_details: {} },
            { sku: '0ab42f88', qty: 4, item_details: {} },
    ]
    },
    {
        _id: 43,
        last_modified: ISODate("2012-03-09T20:55:36Z"),
        status: 'active',
        items: [
            { sku: '00e8da9b', qty: 1, item_details: {} },
            { sku: '0ab42f88', qty: 4, item_details: {} },
        ]
    },
]);


db.so.runCommand("aggregate", {
    pipeline: [
        {   // optional filter to exclude inactive elements - can be removed    
            // you'll want an index on this if you use it too
            $match: { status: "active" }
        },
        // unwind creates a doc for every array element
        { $unwind: "$items" },
        {
            $group: {
                // group by unique SKU, but you only wanted to count a SKU once per doc id
                _id: { _id: "$_id", sku: "$items.sku" },
            }
        },
        {
            $group: {
                // group by unique SKU, and count them
                _id: { sku:"$_id.sku" },
                doc_count: { $sum: 1 },
            }
        }
    ]
    //,explain:true
})

Xin lưu ý rằng tôi đã $ group hai lần, bởi vì bạn đã nói rằng một SKU chỉ có thể được tính một lần cho mỗi tài liệu, vì vậy trước tiên chúng ta cần sắp xếp các cặp doc / sku duy nhất và sau đó đếm chúng.

Nếu bạn muốn đầu ra hơi khác một chút (nói cách khác, CHÍNH XÁC như trong mẫu của bạn), chúng tôi có thể $ chiếu chúng.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để tìm nscanned trong mongoose?

  2. Làm cách nào để thêm người dùng quản trị vào Mongo trong phiên bản 2.6?

  3. Xác thực MongoDB không được bật trên Máy chủ Linux

  4. Không thể sử dụng Mongodb khác biệt trong Nodejs

  5. kết nối với Mongo DB bằng phiên bản mongoose (4.11.0)