sql >> データベース >  >> NoSQL >> MongoDB

SpringDataMongoDB集計-計算値との一致

    必要なのは $ redact > $ cond 演算子を使用し、特別な操作を使用します $$ KEEP 論理条件が真または $$ PRUNE 条件がfalseであったドキュメントを「削除」します。

    この操作は、 $ 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のnullまたはゼロ値をチェックします 部門のフィールドには、 $ cond 代わりにロジックを使用した式。

    次の例では、 Number2 のいずれかの場合、プレースホルダー値が1であると想定しています。 存在しない/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"
                ]
            }
        }
    ])
    

    同等のSpringデータ集約(未テスト)

    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. データをTensorflowに読み込む方法は?

    2. documentdbのサブフィールドのクエリ

    3. 埋め込まれたMongoDBドキュメントがC#ドライバーで保存時にIDを取得しない

    4. MongoDB c#ドライバーオーバーライド文字列のデフォルト値をnullからstring.emptyに