MongoDB findOne () mit $ und auf Array-Elementen

Nov 08 2020

Ich habe ein Schema wie folgt:

Schema = mongoose.Schema    
User= new Schema
    { name: String,
     phones: [
    {
      confirmed: {
        type: Boolean,
        default: false
      },
      number: {
        type: String,
        unique: true
      }
  ]}  

Ich muss eine findOne-Abfrage durchführen, die nach einem bestimmten Namen oder einer Telefonnummer von a sucht, aber nur wenn dies bestätigt wird, habe ich Folgendes versucht, aber es wird als oder behandelt

const userFound = await User.findOne({
    $or: [ { name }, { $and: [{ 'phones.number': phone }, { 'phones.confirmed': true }] }   
    ]
  });

Nehmen wir an, ich habe das folgende Dokument:

{"name": "foo", {"number": 1234, "confirmed": false}}

userFound gibt dieses Dokument zurück, wenn meine Abfrageparameter lauten. name=foo2 , number=1234Irgendwelche Ideen, was ich falsch machen könnte?

Antworten

1 GabrielCastiglioni Nov 08 2020 at 01:45

Mit $ elemMatch können Sie mehr als eine Komponente innerhalb desselben Array-Elements abgleichen.

phones: {$elemMatch: {number:1234, confirmed: true}}
1 J.F. Nov 08 2020 at 01:37

Du bist nah dran.

Diese Abfrage erledigt den Job

db.collection.find({
  "$or": [ { "name": "yourName" }, { "$and": [
        {
          "phones.confirmed": true
        },
        {
          "phones.number": 000000
        }
      ]
    }
  ]
})

Beispiel hier mit mehreren Werten qhier werden nur diejenigen zurückgegeben, deren Name angegeben ist oder deren Telefon übereinstimmt, aber nur, wenn dies bestätigt wird.

Die Verwendung mongooseist die gleiche, jedoch mit Methode User.findOne(...)oder User.find(...).

Wenn Sie Ihre Antwort noch einmal betrachten, ist die Frage fast dieselbe ... Vielleicht habe ich die Frage falsch verstanden? Bitte überprüfen Sie, ob die Ergebnisse der Mongo-Spieler in Ordnung sind, um diese Antwort zu bearbeiten, wenn sie nicht in Ordnung ist.