sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB:Använder matchning med indatadokumentvariabler

Betyder detta att om du använder indatavariabler i en $lookuppipeline måste du använda $expr

Ja korrekt, som standard i filter dvs; i filterdelen av .find() eller i $match aggregeringsstadiet kan du inte använda ett befintligt fält i dokumentet.

Om du överhuvudtaget behöver använda befintligt fälts värde i ditt frågefilter måste du använda aggregeringspipeline, så för att använda aggregeringspipeline i .find() eller i $match du måste avsluta din filterfråga med $expr. Samma sätt att komma åt lokala variabler skapades med let av $lookup filtrera i $match måste lindas av $expr .

Låt oss överväga nedanstående exempel:

Exempel på dokument:

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

Fråga:

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

    Or

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

Test : mongoplayground

Om du ser ovanstående fråga anger du både 1 &4 skickas in i frågan men det kontrollerar du nedanstående fråga där du försöker matcha key field ==value fält - det fungerar inte :

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

Test : mongoplayground

Ovan när du jämför två befintliga fält kan du inte göra det eftersom det betyder att du söker efter dokument med key fältvärde som sträng "$value" . Så att säga att det inte är en sträng, det är faktiskt en referens till value fält du behöver använda $eq aggregeringsoperator istället för $eq frågeoperator som nedan:

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

Test : mongoplayground



  1. Skapa ett flerspråkigt textindex i MongoDB

  2. Hur kan jag använda redis med Django?

  3. Mongodb räknar alla arrayelement i alla objekt som matchar efter kriterier

  4. Hur hittar man oanvända index i MongoDB?