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

Agregat Moongoose $match nie pasuje do identyfikatora

Twoje ids zmienna zostanie zbudowana z "ciągów", a nie ObjectId wartości.

Mongoose „autocasty” wartości ciągu znaków dla ObjectId do prawidłowego typu w zwykłych zapytaniach, ale nie dzieje się tak w potoku agregacji, jak opisano w numerze #1399.

Zamiast tego musisz wykonać prawidłowe przesyłanie, aby pisać ręcznie:

ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })

Następnie możesz ich użyć na etapie potoku:

{ "$match": { "_id": { "$in": ids } } }

Powodem jest to, że potoki agregacji „zwykle” zmieniają strukturę dokumentu, a zatem mangusta nie zakłada, że ​​„schemat” ma zastosowanie do dokumentu na dowolnym etapie potoku.

Można argumentować, że „pierwszy” etap potoku, gdy jest to $match etap powinien to zrobić, ponieważ w rzeczywistości dokument nie jest zmieniany. Ale teraz tak się nie dzieje.

Wszelkie wartości, które mogą być „stringami” lub przynajmniej niewłaściwym typem BSON, muszą być ręcznie rzutowane w celu dopasowania.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb aktualizuje głęboko zagnieżdżony subdokument

  2. Jak zdeserializować obiekt BsonDocument z powrotem do klasy?

  3. MongoDB bind_ip nie będzie działać, jeśli nie zostanie ustawiony na 0.0.0.0

  4. MongoDB elemmatch wiele elementów w tablicy

  5. Grupuj i licz z warunkiem