MongoDB findOne () mit $ und auf Array-Elementen
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
Mit $ elemMatch können Sie mehr als eine Komponente innerhalb desselben Array-Elements abgleichen.
phones: {$elemMatch: {number:1234, confirmed: true}}
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.