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

Các khóa động sau $ group by

Không phải tôi nghĩ đó là một ý kiến ​​hay và chủ yếu là vì tôi không thấy bất kỳ "tổng hợp" nào ở đây là sau khi "nhóm" để thêm vào một mảng, bạn tương tự $push tất cả nội dung đó thành mảng theo "status" nhóm khóa và sau đó chuyển đổi thành các khóa của tài liệu trong $replaceRoot với $arrayToObject :

db.collection.aggregate([
  { "$group": {
    "_id": "$status",
    "data": { "$push": "$$ROOT" }
  }},
  { "$group": {
    "_id": null,
    "data": {
      "$push": {
        "k": "$_id",
        "v": "$data"
      }
    }
  }},
  { "$replaceRoot": {
    "newRoot": { "$arrayToObject": "$data" }
  }}
])

Lợi nhuận:

{
        "inProgress" : [
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5776"),
                        "status" : "inProgress",
                        "description" : "inProgress..."
                }
        ],
        "completed" : [
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5773"),
                        "status" : "completed",
                        "description" : "completed..."
                }
        ],
        "pending" : [
                {
                        "_id" : ObjectId("5b18d14cbc83fd271b6a157c"),
                        "status" : "pending",
                        "description" : "You have to complete the challenge..."
                },
                {
                        "_id" : ObjectId("5b18d31a27a37696ec8b5775"),
                        "status" : "pending",
                        "description" : "pending..."
                }
        ]
}

Điều đó có thể ổn NẾU bạn thực sự đã "tổng hợp" trước, nhưng trên bất kỳ bộ sưu tập có kích thước thực tế nào, tất cả những gì đang làm là cố gắng ép toàn bộ bộ sưu tập vào một tài liệu duy nhất và điều đó có khả năng phá vỡ Giới hạn BSON là 16MB, vì vậy tôi không khuyên bạn nên thử điều này mà không có " nhóm "một cái gì đó khác trước bước này.

Thành thật mà nói, cùng một đoạn mã sau đây cũng hoạt động tương tự và không có thủ thuật tổng hợp và không có vấn đề về giới hạn BSON:

var obj = {};

// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d => {
  if (!obj.hasOwnProperty(d.status))
    obj[d.status] = [];
  obj[d.status].push(d);
})

printjson(obj);

Hoặc ngắn hơn một chút:

var obj = {};

// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d => 
  obj[d.status] = [ 
    ...(obj.hasOwnProperty(d.status)) ? obj[d.status] : [],
    d
  ]
)

printjson(obj);

Các tập hợp được sử dụng để "giảm dữ liệu" và bất kỳ thứ gì chỉ đơn giản là "định hình lại kết quả" mà không thực sự giảm dữ liệu trả về từ máy chủ thường được xử lý tốt hơn trong mã máy khách. Bạn vẫn trả lại tất cả dữ liệu cho dù bạn làm gì và quá trình xử lý con trỏ của ứng dụng khách có chi phí thấp hơn đáng kể. Và KHÔNG có hạn chế.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Chỉ mục MongoDB trên các loại khác nhau

  2. mongodb tìm theo nhiều mục mảng

  3. Hiệu suất tổng hợp tra cứu kém

  4. Mongodb phân trang dựa trên phạm vi

  5. Cách tạo người dùng trong mongodb với docker-compile