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

Tổng hợp Spring Data MongoDB - khớp theo giá trị được tính toán

Những gì bạn cần là mã $ redact toán tử trong khung tổng hợp cho phép bạn xử lý điều kiện logic ở trên với $ cond và sử dụng các phép toán đặc biệt $$ GIỮ để "giữ" tài liệu có điều kiện logic đúng hoặc $$ PRUNE để "xóa" tài liệu có điều kiện sai.

Thao tác này tương tự như có $ dự án đường ống chọn các trường trong bộ sưu tập và tạo một trường mới chứa kết quả từ truy vấn điều kiện logic và sau đó là $match , ngoại trừ $ redact sử dụng một giai đoạn đường ống duy nhất hiệu quả hơn.

Hãy xem xét ví dụ sau đây minh chứng cho khái niệm trên:

db.collection.aggregate([
    { 
        "$redact": {
            "$cond": [
                { 
                    "$gte": [
                        { "$divide": ["$Number1", "$Number2"] },
                        CONSTANT_VAR
                    ]
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

Vì không có không hỗ trợ $ redact nhà điều hành chưa (tại thời điểm viết bài), giải pháp thay thế sẽ là triển khai AggregationOperation giao diện bao bọc hoạt động tổng hợp với một lớp để đưa vào một DBObject :

public class RedactAggregationOperation implements AggregationOperation {
    private DBObject operation;

    public RedactAggregationOperation (DBObject operation) {
        this.operation = operation;
    }

    @Override
    public DBObject toDBObject(AggregationOperationContext context) {
        return context.getMappedObject(operation);
    }
}

sau đó bạn có thể sử dụng trong TypeAggregation :

Aggregation agg = newAggregation(
    new RedactAggregationOperation(
        new BasicDBObject(
            "$redact",
            new BasicDBObject(
                "$cond", new BasicDBObject()
                    .append("if", new BasicDBObject(
                        "$gte", Arrays.asList(
                            new BasicDBObject(
                                "$divide", Arrays.asList( "$Number1", "$Number2" )
                            ), 
                            CONSTANT_VAR
                        )
                    )
                )
                .append("then", "$$KEEP")
                .append("else", "$$PRUNE")
            )
        )
    )
);

AggregationResults<Example> results = mongoTemplate.aggregate(
    (TypedAggregation<Example>) agg, Example.class);

- NGÀY CÚP--

Theo dõi các nhận xét, để kiểm tra các giá trị rỗng hoặc 0 trên Number2 trong phân chia, bạn sẽ phải lồng một mã <> $ cond biểu thức với logic thay thế.

Ví dụ sau giả sử bạn có giá trị giữ chỗ là 1 nếu Number2 không tồn tại / rỗng hoặc có giá trị bằng 0:

db.collection.aggregate([
    { 
        "$redact": {
            "$cond": [
                { 
                    "$gte": [
                        { 
                            "$divide": [
                                "$Number1", {
                                    "$cond": [
                                        {
                                            "$or": [
                                                { "$eq": ["$Number2", 0] },
                                                { 
                                                    "$eq": [
                                                        { "$ifNull": ["$Number2", 0] }, 0
                                                    ]
                                                }
                                            ]
                                        },
                                        1,  // placeholder value if Number2 is 0
                                        "$Number2"                                          
                                    ]
                                }
                            ] 
                        },
                        CONSTANT_VAR
                    ]
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

Tổng hợp dữ liệu mùa xuân tương đương (chưa được kiểm tra)

Aggregation agg = newAggregation(
    new RedactAggregationOperation(
        new BasicDBObject(
            "$redact",
            new BasicDBObject(
                "$cond", Arrays.asList(
                    new BasicDBObject(
                        "$gte", Arrays.asList(
                            new BasicDBObject(
                                "$divide", Arrays.asList( 
                                    "$Number1", 
                                    new BasicDBObject(
                                        "$cond", Arrays.asList( 
                                            new BasicDBObject( "$or": Arrays.asList( 
                                                    new BasicDBObject("$eq", Arrays.asList("$Number2", 0)),
                                                    new BasicDBObject("$eq", Arrays.asList(
                                                            new BasicDBObject("$ifNull", Arrays.asList("$Number2", 0)), 0
                                                        )
                                                    )
                                                )
                                            ),
                                            1,  // placeholder value if Number2 is 0
                                            "$Number2"                                          
                                        )
                                    ) 
                                )
                            ), 
                            CONSTANT_VAR
                        )
                    ), "$$KEEP", "$$PRUNE"
                )
            )
        )
    )
);



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB &Meteor - Truy vấn đẩy vào mảng lồng nhau không hoạt động, không xảy ra lỗi

  2. Mẫu MeteorJS không hiển thị dữ liệu, không xuất hiện

  3. Tính khoảng cách trong Java bằng MongoDB

  4. Cách lưu trữ số lượng lớn trong MongoDB với Node.js

  5. Bắt đầu với Cơ sở dữ liệu không quan hệ bằng Mongodb 🍃