MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongoose Aggregation не филтрира по въведена дата

Mongoose има „схеми“, за които прави това магическо нещо, наречено „автоматично предаване“ за вас. Типичният случай, който дизайнерът(ите) имат предвид тук, е, че всички данни от „уеб“ взаимодействия като GET и POST основно се съдържа в "низ".

Независимо дали има или не някакъв помощник, който превръща параметрите в обекти с ключове и стойности, всички тези „стойности“ все още са „низове“ или евентуално направени директно числови от същите „помощници“, където е подходящо. Това е общ дизайн на уеб рамка.

Така че, когато издадете .find() , тази функция е напълно неработеща за промяна на върнатото съдържание, различно от пропускане на полета/свойства, така че "схемата" се прилага.

.aggregate() метод еизцяло различно. Цялото му съществуване е за промяна съдържание, съдържащо се в документи и колекции. Последицата от това е, че е „невъзможно“ да се приложи схема.

Следователно „автокастингът“, присъстващ в методи като .find() не става и от вас се изисква сами да преобразувате елементи (като „низът“, в който се изпраща вашата „дата“) към правилните типове:

Reservation.aggregate([
   { "$match": { "createdAt": { "$lte": new Date(req.endDate) } } }
])

Дори ако всичко, което правите, е $match и че не сте "променили" схемата по никакъв начин, mongoose не "предполага" това и не се опитва да прехвърли към съвпадащото поле в схемата.

Логиката тук е, че $match етап или нещо подобно, което може да бъде обвързано с "тип", може да се появи навсякъде в тръбопровода. Поради това няма гаранция, че документите, върху които се действа от етап на конвейер, имат някаква прилика с оригиналната схема за събиране.

Вероятно "би могло" евентуално вземете под внимание факта, че това се първият етап на тръбопровода, където нищо не би могло да се промени, и направете подобна проверка. Но текущата кодова база не работи така.

Така че накратко, когато използвате тръбопровода за агрегиране, всички обекти, които трябва да бъдат специално преобразувани към тип (Date, ObjectId и т.н.), трябва да бъдат "ръчно" преобразувани във вашия код, вместо да се предполага, че mongoose ще го направи вместо вас както при други методи.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ръководство за конфигуриране на Load Balancer в MongoDB Sharded Cluster

  2. Повторете цялата база данни на Mongo

  3. Как сериализирате типове стойности с MongoDB C# сериализатор?

  4. Защо се препоръчва да не затваряте MongoDB връзка никъде в кода на Node.js?

  5. Как мога да хоствам собствен сървър за анализиране на Heroku, използвайки MongoDB?