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

基準/集計:配列フィールドに最新のステータスを持つ要素が含まれるすべての完全なドキュメントを検索します

    $expr を使用できます (3.6 mongoバージョン演算子)通常のクエリで集計関数を使用します。

    query operatorsを比較してください vs aggregation comparison operators

    $indexOfArrayを使用します $maxを見つける演算子 ステータス配列のタイムスタンプ要素を更新した後、ステータス値を投影し、入力ステータスに対して値をチェックするための比較を行います。

    つまり、シェルクエリは

    {
      "key":"56h68ab4c876dbe1cd0b1ee",
      "$expr":{
        "$eq":[
          {"$let":{
            "vars":{
              "status":{"$arrayElemAt":["$status",{"$indexOfArray":["$status.updatedTimeStamp",{"$max":"$status.updatedTimeStamp"}]}]}
            },
            "in":"$$status.orderStatus"
          }},
          "CONFIRM_PAYMENT"]
      }
    }
    

    春のコード:

    Query query = new BasicQuery("{key:'56h68ab4c876dbe1cd0b1ee','$expr':{'$eq':[{$let:{vars:{status:{'$arrayElemAt':['$status',{'$indexOfArray':['$status.updatedTimeStamp',{'$max':'$status.updatedTimeStamp'}]}]}}, in:'$$status.orderStatus'}},'CONFIRM_PAYMENT']}}");
    List<Document> results = mongoTemplate.find(query, Document.class);
    

    Mongo 3.4の苦情バージョン:

    シェルクエリ:

    db.order.aggregate([ 
      { "$match" : { "key" : "56h68ab4c876dbe1cd0b1ee"}} , 
      { "$addFields" : {
        "cmpret" : { 
          "$eq" : [ 
            { "$let" : {
              "vars" : { "status" : { "$arrayElemAt" : [ "$status" , { "$indexOfArray" : [ "$status.updatedTimeStamp" , { "$max" : "$status.updatedTimeStamp"}]}]}} ,
              "in" : "$$status.orderStatus"
            }} , 
            "CONFIRM_PAYMENT"
          ]
        }
      }} , 
      { "$match" : { "cmpret" : true}} , 
      { "$project" : { "cmpret" : 0}}
    ])
    

    春のコード:

      AggregationOperation match1 = Aggregation.match(Criteria.where("key").is("56h68ab4c876dbe1cd0b1ee"));
            AggregationOperation addFields = new AggregationOperation() {
                @Override
                public Document toDocument(AggregationOperationContext aggregationOperationContext) {
                    Document cmpret = Document.parse("{'$eq':[{$let:{vars:{status:{'$arrayElemAt':['$status',{'$indexOfArray':['$status.updatedTimeStamp',{'$max':'$status.updatedTimeStamp'}]}]}}, in:'$$status.orderStatus'}},'CONFIRM_PAYMENT']}}");
                    return new Document("$addFields", new Document("cmpret", cmpret));
                }
            };
    
      AggregationOperation match2 =  Aggregation.match(Criteria.where("cmpret").is(true));
    
       AggregationOperation dropFields = new AggregationOperation() {
                @Override
                public Document toDocument(AggregationOperationContext aggregationOperationContext) {
                    return new Document("$project", new Document("cmpret", 0));
                }
            };
       Aggregation aggregation = Aggregation.newAggregation(
                    match1,
                    addFields,
                    match2,
                    dropFields
        );
    
       AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, "order", Document.class);
    



    1. Meteor JS:クライアントがMongoDBからデータを取得していません

    2. nodejsとmongooseを使用して複数のJSONオブジェクトを取得するにはどうすればよいですか?

    3. NoSqlデータベース(MongoDB)で外部キーを適用するにはどうすればよいですか?

    4. NestJSのABC:MongoDB(Mongoose)の初心者向けガイド。