sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB-områdeforespørgsel på hele den indlejrede dokumentværdi

Bemærk kommandoen et par linjer nede i den dokumentation, du linkede til:

Dette fortæller dig, at ikke-eksisterende felter og felter sat til null behandles specielt.

For at få dokumenterne {} og {a: null} for at være ækvivalent i sorteringsrækkefølge, skal sorteringsalgoritmen overveje, at det manglende sorteringsfelt er til stede og have en værdi på null .

Hvis du udtrykkeligt tilføjer det manglende felt, bare for at se, hvordan det ser ud, giver rækkefølgen mere mening.

Filteret {tag: { $gte: { baz: MinKey() }}} anvendt på {_id: 1, tag: {bar: "BAR"}} sammenligner i det væsentlige {baz: MinKey()} med {baz: null, bar: "BAR"} .

Nær toppen af ​​den dokumentation, du linkede, står der, at MinKey er mindre end null , så det er den rigtige rækkefølge.

REDIGER

Generelt er forespørgsel mest effektivt, når feltnavnene ikke i sig selv er data. Med hensyn til en tabelbaseret database, hvilken kolonne ville indeholde "baz"?

En lille ændring i skemaet ville forenkle denne type forespørgsel. I stedet for {tagname: tagvalue} , brug {k:tagname, v:tagvalue} . Du kan derefter indeksere tag.k og/eller tag.v , og forespørg på tag.k for at finde alle dokumenter med et "baz"-tag, ville forespørgsler på tags med ulighedsoperationer fungere mere intuitivt.

db.collection.find({"tag.k":{$gte:"baz"}})

Præcise matches kunne udføres med elemMatch like

db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})

Hvis du virkelig har brug for, at de returnerede dokumenter indeholder {tagname: tagvalue} , $arrayToObject aggregeringsoperatør kan gøre det:

db.collection.aggregate([
  {$match: {
      "tag.k": {$gte: "baz"}
  }},
  {
    $addFields: {
      tag: {$arrayToObject: [["$tag"]]}
  }}
])

Legeplads




  1. OData-tjeneste ved hjælp af NodeJS og JayData

  2. Masseopdatering af matchende underdokument i Mongodb

  3. Redis pub/sub til chatserver i node.js

  4. Forskellen mellem count() og find().count() i MongoDB