0

Я просто хочу подсчитать элемент в массиве на основе запроса. Я попробовал следующую команду, но не решил свою проблему.Найти элемент в массиве с помощью mongodb

Я хочу посчитать элемент, чей TimeStamp находится между «2017-02-17T18: 30: 00.000Z» и «2017-02-18T18: 29: 59.999Z» в массиве DATA2, но он возвращает только 1.

КОД Выполненная:

КОД 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(); 

      }) 

Code 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", 

     } 
    ] 
} 

Результат: Я получаю первый элемент DATA2 с помощью кода 3, но я знаю, что в соответствии с запросом 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

Большое вам спасибо. Вы спасли мое время. :) Я забыл попробовать $ filter :(Спасибо тебе снова. – Beginner