MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Agregacja Spring Data MongoDB — dopasowanie według obliczonej wartości

Potrzebujesz $redact operator w ramach agregacji, który umożliwia przetwarzanie powyższego warunku logicznego za pomocą $cond operatora i używa operacji specjalnych $$KEEP aby „zachować” dokument, w którym warunek logiczny jest prawdziwy lub $$PRUNE aby „usunąć” dokument, w którym warunek był fałszywy.

Ta operacja jest podobna do posiadania $project potok, który wybiera pola w kolekcji i tworzy nowe pole zawierające wynik zapytania o warunek logiczny, a następnie kolejne $match , z tym wyjątkiem, że $redact używa jednego etapu potoku, który jest bardziej wydajny.

Rozważ następujący przykład, który demonstruje powyższą koncepcję:

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

Ponieważ nie ma brak wsparcia dla $redact operator jeszcze (w momencie pisania tego tekstu), obejściem będzie zaimplementowanie AggregationOperation interfejs, który otacza operację agregacji klasą do przyjęcia 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);
    }
}

których możesz następnie użyć w 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);

--AKTUALIZACJA--

Kontynuacja z komentarzy, aby sprawdzić wartości null lub zero w Number2 pole w dywizji, musiałbyś zagnieździć $cond wyrażenie z logiką.

W poniższym przykładzie założono, że masz wartość symbolu zastępczego wynoszącą 1, jeśli albo Number2 nie istnieje/jest null lub ma wartość zero:

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

Równoważna wiosenna agregacja danych (nieprzetestowana)

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. ECS Fargate nie obsługuje montowań powiązań

  2. Kiedy kursor mongodb wygaśnie

  3. Czy można używać MongoDB jako wbudowanej bazy danych?

  4. Zapytanie o zagnieżdżoną tablicę w MongoDb

  5. Procent warunków OR dopasowanych w mongodb