MongoDB findOne () utilizzando $ e sugli elementi dell'array

Nov 08 2020

Ho uno schema come segue:

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

Devo fare una query findOne che cerchi un certo nome o un numero di telefono di un ma solo se è confermato ho provato quanto segue ma lo tratta come un o invece

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

Diciamo che ho il seguente documento:

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

userFound restituisce quel documento quando i miei parametri di query sono name=foo2 , number=1234Qualche idea su cosa potrei fare di sbagliato?

Risposte

1 GabrielCastiglioni Nov 08 2020 at 01:45

Prova con $ elemMatch ti consente di abbinare più di un componente all'interno dello stesso elemento dell'array.

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

Sei vicino.

Questa query fa il lavoro

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

Esempio qui con più valori qqui vengono restituiti solo quelli il cui nome è dato o il telefono corrisponde ma solo se è confermato.

L'uso mongooseè lo stesso ma con metodo User.findOne(...)o User.find(...).

Guardando di nuovo la tua risposta, la domanda è quasi la stessa ... forse ho frainteso la domanda? Per favore, controlla se i risultati del giocatore mongo sono ok per modificare questa risposta se non va bene.