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

Đếm trường tài liệu con riêng biệt và đầu ra dưới dạng các phím được đặt tên

Trường hợp cơ bản ở đây là sử dụng .aggregate() với $unwind bởi vì bạn cần quyền truy cập vào các giá trị trong mảng làm khóa nhóm của mình và tất nhiên là $group bởi vì đó là cách bạn "nhóm" mọi thứ:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }}
])

Điều này sẽ cung cấp cho bạn kết quả như:

{ "_id": "ANTIQUES", "count": 56 }
{ "_id": "TOOLS", "count": 89 }
{ "_id": "JEWLRY", "count":  45 }

Bây giờ bạn thực sự nên học cách sống chung với điều đó, bởi vì một "danh sách" ở định dạng con trỏ mặc định là một điều tốt và có thể lặp lại một cách tự nhiên. Ngoài ra, các khóa có tên IMHO không tự nhiên cho phép bản trình bày dữ liệu và bạn thường muốn có một thuộc tính chung trong danh sách có thể lặp lại.

Nếu bạn thực sự có ý định sử dụng đầu ra các khóa có tên số ít, thì bạn sẽ cần MongoDB 3.4.4 trở lên để có quyền truy cập vào $arrayToObject điều đó sẽ cho phép bạn sử dụng các giá trị làm tên của khóa và tất nhiên $replaceRoot để sử dụng kết quả biểu thức đó làm tài liệu mới để tạo:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }},
  { "$group": {
    "_id": null,
    "data": { "$push": { "k": "$_id", "v": "$count" } }
  }},
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": "$data"
    }
  }}
])

Hoặc nếu bạn không có tùy chọn đó, thì thay vào đó, bạn nên chuyển đổi đầu ra con trỏ trong mã:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }}
]).toArray().reduce((acc,curr) => 
  Object.assign(acc,{ [curr._id]: curr.count }),
  {}
)

Cả hai hợp nhất thành một đối tượng duy nhất với các khóa được đặt tên từ kết quả tổng hợp ban đầu:

{
    "ANTIQUES": 56,
    "TOOLS": 89,
    "JEWLRY": 45,
    ...
}

Và điều đó cho thấy rằng kết quả đầu ra ban đầu đã thực sự đủ và thông thường bạn muốn loại "định hình lại lần cuối" đó được thực hiện trong mã sử dụng đầu ra con trỏ, nếu bạn thực sự cần định dạng lại từ cơ bản dữ liệu cần thiết vẫn được trả lại.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách khởi động mongo db trên Windows

  2. Cập nhật tài liệu nhúng trong MongoDB với trình điều khiển C # chính thức

  3. MongoDB:Cách sử dụng một lược đồ làm tài liệu con cho các bộ sưu tập khác nhau được xác định trong các tệp khác nhau

  4. Ứng dụng hoạt động trong quá trình phát triển nhưng không hoạt động khi được triển khai cho heroku

  5. Lỗi:querySrv ENODATA _mongodb._tcp.blog-cluster-0hb5z.mongodb.net tại QueryReqWrap.onresolve [as oncomplete]