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

MongoDB:Použití shody s proměnnými vstupního dokumentu

Znamená to, že pokud používáte vstupní proměnné v $lookuppipeline, musíte použít $expr

Ano správně, ve výchozím nastavení ve filtrech, tj. v části filtru .find() nebo v $match fázi agregace nemůžete použít existující pole v dokumentu.

Pokud vůbec potřebujete použít existující hodnotu pole ve vašem filtru dotazů, musíte použít agregační kanál, takže abyste mohli použít agregační kanál v .find() nebo v $match musíte svůj dotaz na filtr zabalit do $expr. Stejný způsob přístupu k místním proměnným byl vytvořen pomocí let z $lookup filtrovat v $match musí být zabalen do $expr .

Uvažujme níže uvedený příklad:

Ukázkové dokumenty:

[
  {
    "key": 1,
    "value": 2
  },
  {
    "key": 2,
    "value": 4
  },
  {
    "key": 5,
    "value": 5
  }
]

Dotaz:

 db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })

    Or

 db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])

Test: mongohřiště

Pokud vidíte výše uvedený dotaz, zadejte 1 &4 jsou předány do dotazu, ale pokud se podíváte na dotaz níže, pokusíte se najít key pole ==value pole - nefunguje to :

db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])

Test: mongohřiště

Pokud výše porovnáváte dvě existující pole, nemůžete to udělat, protože to znamená, že kontrolujete dokumenty pomocí key hodnotu pole jako řetězec "$value" . Takže říci, že to není řetězec, je to ve skutečnosti odkaz na value musíte použít $eq agregační operátor namísto $eq operátoru dotazu, jak je uvedeno níže:

 db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])

Test: mongohřiště



  1. MongoDB remove()

  2. Promítnout první položku v poli do nového pole (agregace MongoDB)

  3. Jak vytáhnout jednu instanci položky v poli v MongoDB?

  4. Geoprostor $ blízko aktuální hodnoty pole dokumentu