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

MongoDB elemMatch nie działa oczekiwano

Nie ma nic złego w zachowaniu $elemMatch . Działa zgodnie z oczekiwaniami. Dokument mówi również:

Ogólna zasada za każdym razem, gdy projektujesz array używając $elemMatch , tylko jeden elementów będzie wyświetlanych co najwyżej . Jeśli żaden z elementów w tablicy nie pasuje, pole nie będzie w ogóle wyświetlane.

Więc otrzymany wynik jest poprawny, tylko pierwszy element w tablicy, który pasuje do warunku w $elemMatch będzie projected .

{
    "_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
    "Statuses" : [{
        ....
        "StatusID": NumberLong(525623822633172993),
        ....
    }]
}

Możesz spróbować zmienić kolejność dokumentów w tablicy statusów i możesz otrzymać inny pasujący dokument, jeśli ten dokument pojawi się przed innymi pasującymi dokumentami w tablicy.

Zobacz:$elemMatch

Przechodząc do Twoich wymagań, jeśli chcesz, aby wszystkie pasujące elementy tablicy znalazły się w wyniku, musisz wykonać operację agregacji.

  • Match te dokumenty, które mają wymagany _id i te dokumenty, które zawierają poddokument statusu, którego szukamy.
  • unwind tablica statusów.
  • Ponownie match poszczególne rozwinięte dokumenty.
  • Nareszcie group dopasowane dokumenty według _id .

Kodeks:

db.collection.aggregate([
{$match:{ "_id": ObjectId("5439a2992ea8cc0f70feef2d"),
          "Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$unwind:"$Statuses"},
{$match:{"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$group:{"_id":"$_id",statuses:{$push:"$Statuses"}}}
])

co da ci wszystkie pasujące dokumenty podrzędne w tablicy.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB i wyszukiwanie pełnotekstowe część słowa

  2. MongoDB :jak ustawić nowe pole równe wartości innego pola, dla każdego dokumentu w kolekcji

  3. Zmniejsz ilość pamięci używanej podczas ładowania ogromnych ramek danych pandy z MongoDB

  4. com.mongodb.MongoException:brak rozmowy z masterem i zużyta liczba ponownych prób

  5. Czy potrzebuję mangusty z graphql?