0

クエリに基づいて配列の要素を数えたいだけです。私は次のコマンドを試しましたが、私の問題を解決しませんでした。mongodbを使用して配列内の要素を検索

DATA2配列の "2017-02-17T18:30:00.000Z"と "2017-02-18T18:29:59.999Z"の間にあるTimeStampの要素を数えたいだけです。

実行さ

CODE:

CODE 1

db.ABC.aggregate([{ 
       $match: { 
        $and: [{ 

         DATA2: { 
          $exists: true 
         } 

        }, { 
         "DATA2.TimeStamp": { 
          $gte: require('../../modules/getDates').getFromDate(item), 
          $lte: require('../../modules/getDates').getToDate(item) 
         } 
        }, { 
         Client_id: "123" /*req.query.client_id*/ 
        }] 
       } 
      }, { 


       $project: { 

        DATASiz: { 
         $size: "$DATA2" 
        }, 
        "has bananas": { 
         $in: ["DATA2.$.TimeStamp"] 
        } 
       } 
      }], function(err, result) { 

       console.log(result) 
       callBack(); 

      }) 

コード2

db.abc.find({ $and:[{DATA2: {$exists: true}},{Client_id: "123"},{"DATA2": { $elemMatch: { TimeStamp: { $gte: require('../../modules/getDates').getFromDate(item), $lte: require('../../modules/getDates').getToDate(item) } } }}] 
}, function(err, result) { 

      console.log(JSON.stringify(result)) 
      callBack(); 

      }) 

コード3

//db.abc.find //also tried 
    db.abc.count({ 
        $and: [{ 

         DATA2: { 
          $exists: true 
         } 

        }, { 
         "DATA2.TimeStamp": { 
          $gte: require('../../modules/getDates').getFromDate(item), 
          $lte: require('../../modules/getDates').getToDate(item) 
         } 
        }, { 
         Client_id: "123" /*req.query.client_id*/ 
        }] 
       },{ 
        "DATA2.$":1 
       }, function(err, result) { 

        console.log(result) 
        callBack(); 

       }) 

JSONフォーマット:

{ 
    "_id": { 
     "$oid": "57c7404985737e2c78fde6b3" 
    }, 
    "ABC": "1304258470", 
    "Status": "Not Found", 
    "DATA1": [ 
     {123},{123},{123} 
    ], 
    "Remark": "Not Found", 
    "DATA2": [ 
     { 
      "TimeStamp": "2017-02-18T09:01:43.060Z", 
      "NdrStatus": "Door Locked", 

     }, 
     { 
      "TimeStamp": "2017-02-18T08:09:43.347Z", 
      "NdrStatus": "HOLD", 

     }, 
     { 
      "TimeStamp": "2017-02-20T08:09:43.347Z", 
      "NdrStatus": "HOLD", 

     } 
    ] 
} 

結果: 私はCODE 3を使用してDATA2の最初の要素を取得していますが、私は、クエリごとに2つの要素を返すようにしていることを知っています。

私はカウントで2を期待しています。 また、$ unwind $ redact もありがとうございます。

+0

をお使いのMongoDBサーバのバージョンは何ですか? – chridam

+0

mongodバージョン:3.2.11 – Beginner

答えて

0

あなたはこのため$filter$sizeの演算子を使用することができます

var start = require('../../modules/getDates').getFromDate(item), 
    end = require('../../modules/getDates').getToDate(item); 

db.ABC.aggregate([ 
    { 
     "$match": { 
      "DATA2": { "$exists": true }, 
      "DATA2.TimeStamp": { "$gte": start, "$lte": end }, 
      "Client_id": "123" 
     } 
    }, 
    { 
     "$project": { 
      "DATASiz": { 
       "$size": { 
        "$filter": { 
         "input": "$DATA2", 
         "as": "item", 
         "cond": { 
          "$and": [ 
           { "$gte": ["$$item.TimeStamp", start] }, 
           { "$lte": ["$$item.TimeStamp", end] } 
          ] 
         } 
        } 
       } 
      } 
     } 
    } 
], function(err, result) { 
    console.log(result); 
    callBack(); 
}); 
+1

ありがとうございました。あなたは私の時間を救った。 :)私は$フィルタを試して忘れていた:(ありがとうございました。 – Beginner

関連する問題