2016-11-14 2 views
1

Допустим, у меня есть документ, как это:Конкретная дата сравнения

{ 
    productName: 'soap', 
    expiredDate: ISO_DATE_FORMAT 
} 

В обычном SQL я могу запросить как этот: SELECT * FROM table_name WHERE Month(expiredDate) = 11.

Как достичь этого в mongoDB или mongooseJS?

ответ

1

Вы можете использовать структуру агрегации, которая имеет некоторые операторы, которые вы можете использовать. Рассмотрим первый случай использования, который смотрит на манипулировании date operators внутри $project трубопровода и последующего $match трубопровода для фильтрации документов на основе дополнительного поля с выражением на $month:

db.collection.aggregate([ 
    { 
     "$project": { 
      "productName": 1, 
      "expiredDate": 1, 
      "expiredMonth": { "$month": "$expiredDate" } 
     } 
    }, 
    { "$match": { "expiredMonth": 11 } } 
]) 

другой опция использует один конвейер с оператором , который включает в себя функциональность $project и $match, как указано выше, и возвращает все документы, которые соответствуют заданному условию, используя $$KEEP системную переменную, отбрасывая те, которые не совпадают с помощью системной переменной $$PRUNE. Имейте в виду, что этот оператор выполняет сканирование коллекции, поэтому первая оптимальная схема трубопровода может быть оптимальной:

db.collection.aggregate([ 
    { 
     "$redact": { 
      "$cond": [ 
       { 
        "$eq": [ 
         { "$month": "$expiredDate" }, 
         11 
        ] 
       }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    } 
]) 
+1

кажется работающим. Сначала я изучу структуру агрегации, а затем применил ее для моего варианта использования. Потому что на самом деле мой вариант использования немного отличается от этого примера. Спасибо за ваше объяснение. – Kim

0

Вы можете использовать Рамочные агрегации

db.collection.aggregate([{$project : {month : {"$month" : $expiredDate},productName : 1,expiredDate:1},{$match : {month : 11}}])