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

Mongo-forespørgsel på flere felter af underdokument

Dette er faktisk hvad $elemMatch operatør er til, selvom den ofte misbruges. Det udfører i det væsentlige forespørgselsbetingelserne på hvert element "inden for" arrayet. Alle MongoDB-argumenter er en "og"-operation, medmindre andet udtrykkeligt kaldes:

db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2  } } })

Du vil sikkert også gerne "projektere" her, hvis du kun forventer det matchede felt og ikke hele dokumentet:

db.collection.find(
    { "arr": { "$elemMatch": { "name": "b", "num": 2  } } },
    { "arr.$": 1 }
)

Til sidst for at forklare, hvorfor dit andet forsøg ikke virker, denne forespørgsel:

db.collection.find({
    "arr": [
        { "name": "b", "num": 2 }
    ]
})

Matcher ikke noget, fordi der ikke er noget egentligt dokument, hvor "arr" indeholder et enkelt element, der nøjagtigt matcher dine betingelser.

Dit første eksempel mislykkedes..:

db.collection.find({
    $and: [
        { "arr.name": "b" },
        { "arr.num": 2 }
    ]
});

Fordi der er flere array-elementer, der opfylder betingelserne, og dette anses ikke kun for, at begge betingelser gælder for det samme element. Det er hvad $elemMatch tilføjer, og når du har brug for mere end én betingelse for at matche, så er det her, du bruger det.




  1. MongoDB - Opret et dokument

  2. Leverer dynamiske URL'er med express og mongodb

  3. 3 enkle trin til at forbedre sikkerheden for din MongoDB-installation

  4. Hvordan projekterer DBRef på Spring MongoDB Aggregation?