MongoDB findOne () usando $ e em elementos de array

Nov 08 2020

Eu tenho um esquema da seguinte maneira:

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

Preciso fazer uma consulta findOne que procure um determinado nome ou número de telefone de a, mas apenas se for confirmado, tentei o seguinte, mas está tratando como um ou em vez disso

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

Digamos que tenho o seguinte documento:

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

userFound está retornando aquele documento quando meus parâmetros de consulta são name=foo2 , number=1234Alguma ideia do que eu posso estar fazendo errado?

Respostas

1 GabrielCastiglioni Nov 08 2020 at 01:45

Try with $ elemMatch permite que você combine mais de um componente no mesmo elemento do array.

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

Você está perto.

Esta consulta faz o trabalho

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

Exemplo aqui com vários valores qhere apenas são retornados aqueles cujo nome é fornecido ou telefone correspondente, mas apenas se for confirmado.

Usar mongooseé o mesmo, mas com o método User.findOne(...)ou User.find(...).

Olhando novamente para sua resposta, a pergunta é quase a mesma ... talvez eu tenha entendido mal a pergunta? Por favor, verifique se os resultados do jogador mongo estão ok para editar esta resposta se não estiver ok.