sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB elemMatch nefunguje očekávaně

Na chování $elemMatch není nic špatného . Funguje podle očekávání. Doktor také říká:

Zpravidla vždy, když promítáte array pomocí $elemMatch , pouze jeden prvků se promítne nanejvýš . Pokud se žádný z prvků v poli neshoduje, pole se vůbec nepromítne.

Takže výsledek, který dostanete, je správný, pouze první položka v poli, která odpovídala podmínce v $elemMatch bude projected .

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

Můžete zkusit změnit pořadí dokumentů v poli stavů a ​​můžete získat jiný odpovídající dokument, pokud se tento dokument objeví před ostatními odpovídajícími dokumenty v poli.

Viz:$elemMatch

Pokud jde o váš požadavek, chcete-li mít ve výsledku všechny odpovídající prvky pole, musíte provést operaci agregace.

  • Match ty dokumenty, které mají požadované _id, a ty dokumenty, které obsahují stavový dílčí dokument, který hledáme.
  • unwind pole stavů.
  • Opět match jednotlivé odvinuté dokumenty.
  • Nakonec group odpovídající dokumenty podle _id .

Kód:

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ž vám poskytne všechny odpovídající dílčí dokumenty v poli.



  1. MongoDB – Nelze kanonizovat dotaz:BadValue neznámý operátor:$meta

  2. mongo:návrat se nerovná count()

  3. Apache Phoenix pro CDH

  4. $concat pole s indexem v $map mongodb?