MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Agregacja Mongoose nie filtruje według daty wprowadzenia

Mongoose ma „schematy”, dla których robi dla ciebie tę magiczną rzecz zwaną „autocastingiem”. Typowym przypadkiem, o którym mają na myśli projektanci, jest to, że wszystkie dane wejściowe z interakcji „sieciowych”, takich jak GET i POST jest zasadniczo zawarty w "ciągu".

Niezależnie od tego, czy istnieje jakiś pomocnik, który przekształca parametry w obiekty z kluczami i wartościami, wszystkie te „wartości” są nadal „łańcuchami” lub ewentualnie są bezpośrednio numerowane przez tych samych „pomocników” tam, gdzie jest to właściwe. Jest to typowy projekt frameworka internetowego.

Więc kiedy wydajesz .find() , ta funkcja jest całkowicie niedostępna zmiany zwracanej treści w inny sposób niż przez pominięcie pól/właściwości, dlatego stosowany jest „schemat”.

.aggregate() metoda jest całkowicie różne. Całe jego istnienie polega na modyfikowaniu treści zawarte w dokumentach i zbiorach. Konsekwencją tego jest to, że "niemożliwe" jest zastosowanie schematu.

Stąd "autocasting" obecny w metodach takich jak .find() nie dzieje się , i musisz samodzielnie rzutować elementy (takie jak „ciąg”, w którym Twoja „data” jest wysyłana jako ) do odpowiednich typów:

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

Nawet jeśli wszystko, co robisz, to $match i że nie "zmodyfikowałeś" schematu w żaden sposób, mangusta nie "zakłada" tego i nie próbuje rzutować na pasujące pole w schemacie.

Logika jest taka, że ​​$match stage lub coś podobnego, co może być powiązane z „typem”, może wystąpić w dowolnym miejscu potoku. W związku z tym nie ma gwarancji, że dokumenty, na których działa etap potoku, będą w jakikolwiek sposób przypominać oryginalny schemat kolekcji.

Prawdopodobnie „może” prawdopodobnie rozważ fakt, że to jest pierwszy etap rurociągu, na którym nic nie mogło się zmienić i przeprowadzić podobną inspekcję. Ale tak nie działa obecna baza kodu.

Krótko mówiąc, podczas korzystania z potoku agregacji wszystkie obiekty, które muszą być specjalnie rzutowane na typ ( Date, ObjectId itp. ) muszą być rzutowane "ręcznie" w twoim kodzie, zamiast zakładać, że mangusta zrobi to za ciebie podobnie jak w innych metodach.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak zainstalować wcześniejszą wersję mongodb z homebrew?

  2. mongodb db.collection.find({}) nie robi nic poza .limit(101)

  3. MongoDB zmienia nazwę pola bazy danych w tablicy

  4. Zwróć dokument z dokumentem podrzędnym Max

  5. Hak przed zapisem Mongoose uruchamia się, ale nie zapisuje dodatkowego pola (NIE przy użyciu modelu.update)