MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Agregasi Data Musim Semi MongoDB - cocokkan dengan nilai yang dihitung

Yang Anda butuhkan adalah $redact operator dalam kerangka agregasi yang memungkinkan Anda untuk memproses kondisi logis di atas dengan $cond operator dan menggunakan operasi khusus $$KEEP untuk "menyimpan" dokumen dengan kondisi logika benar atau $$PRUNE untuk "menghapus" dokumen yang kondisinya salah.

Operasi ini mirip dengan memiliki $project pipa yang memilih bidang dalam koleksi dan membuat bidang baru yang menyimpan hasil dari kueri kondisi logis dan kemudian $match , kecuali $redact menggunakan satu tahap pipeline yang lebih efisien.

Perhatikan contoh berikut yang menunjukkan konsep di atas:

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

Karena tidak ada dukungan untuk $redact belum operator (pada saat penulisan), solusinya adalah dengan mengimplementasikan AggregationOperation antarmuka yang membungkus operasi agregasi dengan kelas untuk menerima 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);
    }
}

yang kemudian dapat Anda gunakan di 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);

--UPDATE--

Tindak lanjut dari komentar, untuk memeriksa nilai nol atau nol pada Number2 bidang di divisi, Anda harus membuat sarang $cond ekspresi dengan logika sebagai gantinya.

Contoh berikut mengasumsikan Anda memiliki nilai placeholder 1 jika salah satu Number2 tidak ada/tidak ada atau bernilai nol:

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"
            ]
        }
    }
])

Agregasi Data Musim Semi Setara (belum diuji)

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. Mongo - Cocokkan di mana kunci objek adalah variabel

  2. Pipa agregat MongoDB lambat setelah langkah pertandingan pertama

  3. Pengoptimalan kueri MongoDB

  4. Cari berdasarkan elemen objek dalam array

  5. Cara yang tepat untuk menangani perubahan skema di MongoDB dengan driver java