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

lấy tất cả các tài liệu có giá trị tối đa bằng cách sử dụng tổng hợp trong mongodb

Nếu bạn muốn giữ thông tin tài liệu, thì về cơ bản bạn cần phải $ push nó thành một mảng. Nhưng tất nhiên, sau đó có $ max , bạn cần lọc nội dung của mảng để chỉ các phần tử phù hợp với:

db.coll.aggregate([
    { "$group":{ 
        "_id": "$country",
        "maxQuantity": { "$max": "$quantity" },
        "docs": { "$push": {
            "_id": "$_id",
            "name": "$name",
            "quantity": "$quantity"
        }}
    }},
    { "$project": {
        "maxQuantity": 1,
        "docs": {
            "$setDifference": [
               { "$map": {
                   "input": "$docs",
                   "as": "doc",
                   "in": {
                       "$cond": [ 
                           { "$eq": [ "$maxQuantity", "$$doc.quantity" ] },
                           "$$doc",
                           false
                       ]
                   }
               }},
               [false]
            ]
        }
    }}
])

Vì vậy, bạn lưu trữ mọi thứ trong một mảng và sau đó kiểm tra từng thành viên của mảng để xem liệu giá trị của nó có khớp với giá trị được ghi là tối đa hay không, loại bỏ bất kỳ thành viên nào không.

Tôi sẽ giữ _id giá trị trong tài liệu mảng vì đó là điều khiến chúng trở thành "duy nhất" và sẽ không bị ảnh hưởng bất lợi bởi $ setDifference khi lọc ra các giá trị. Nhưng tất nhiên nếu "tên" luôn là duy nhất thì nó sẽ không bắt buộc.

Bạn cũng có thể chỉ trả lại bất kỳ trường nào bạn muốn từ $ map , nhưng tôi chỉ trả lại toàn bộ tài liệu chẳng hạn.

Hãy nhớ rằng điều này có giới hạn là không vượt quá giới hạn kích thước BSON là 16MB, vì vậy đối với các mẫu dữ liệu nhỏ thì không sao, nhưng bất kỳ thứ gì tạo ra một danh sách có thể lớn (vì bạn không thể lọc trước nội dung mảng) sẽ tốt hơn được xử lý bằng truy vấn riêng để tìm các giá trị "tối đa" và một truy vấn khác để tìm nạp các tài liệu phù hợp.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sự mơ hồ về $ geoNear trong truy vấn tổng hợp

  2. Làm cách nào để kết nối với X509 bằng cách đặt tất cả các tùy chọn trong chuỗi kết nối trong trình điều khiển node.js cho mongodb?

  3. MongoDB có thể điền vào tài liệu trống không

  4. Làm cách nào để lưu trữ mảng đã sắp xếp trở lại MongoDB?

  5. Xếp tầng tùy chỉnh trong dữ liệu mùa xuân MongoDB