MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Spring Data MongoDB агрегиране - съвпадение по изчислена стойност

Това, от което се нуждаете, е $redact оператор в рамката за агрегиране, който ви позволява да обработите горното логическо условие с $cond оператор и използва специалните операции $$KEEP за да „запазите“ документа, където логическото условие е вярно или $$PRUNE за да "премахнете" документа, където условието е невярно.

Тази операция е подобна на наличието на $project конвейер, който избира полетата в колекцията и създава ново поле, което съдържа резултата от заявката за логическо условие и след това последващо $match , освен че $redact използва един етап на конвейер, който е по-ефективен.

Разгледайте следния пример, който демонстрира горната концепция:

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

Тъй като има няма поддръжка за $redact оператор още (по време на писане), заобиколно решение ще бъде прилагането на AggregationOperation интерфейс, който обвива операцията за агрегиране с клас, който да вземе в 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);
    }
}

които след това можете да използвате в 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);

--АКТУАЛИЗАЦИЯ--

Последващи действия от коментарите, за да проверите за нули или нулеви стойности на Number2 поле в разделянето, ще трябва да вложите $cond израз с логиката вместо това.

Следващият пример предполага, че имате стойност на заместител 1, ако Number2 не съществува/е null или има стойност нула:

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

Еквивалентно агрегиране на пролетни данни (нетествано)

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 4.2

  2. Най-добрият начин за съхраняване на изображения в уеб приложение MERN стек

  3. Вземете най-новия поддокумент от Array

  4. Golang BSON преобразуване

  5. MongoDB - Импортиране на данни