MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongoose obtém documentos que correspondem à matriz


Contanto que você perceba que está correspondendo no ObjectId e não em nada na coleção referenciada, você pode usar o $in operador:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })

Onde, claro, esses são seus valores reais de ObjectId.

Mas se você realmente quer dizer um documento que tem exatamente essa matriz, basta passar a matriz:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })

E se ele deve ter os dois elementos, mas pode ter outros, atualmente você precisa usar um $e expressão:
db.collection.find({ "$and": [ 
    { "members": "some id 1" },
    { "members": "some id 2" } 
]})

Mas a partir da versão 2.6 em diante, você pode usar corretamente o $all operador para efetivamente fazer o mesmo:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })

A outra forma corresponde apenas a esses dois elementos, mas em qualquer ordem. Portanto, existem duas abordagens:
db.collection.find({ "$or": [
    { "members": [ "some id 1", "some id 2" ] },
    { "members": [ "some id 2", "some id 1" ] }
]})

Isso usa um $or lógico dizer que a matriz deve ser exata, mas pode ser organizada de qualquer maneira. E a outra abordagem:
db.collection.find({ "$and": [ 
    { "members": "some id 1" },
    { "members": "some id 2" }
    { "members": { "$size": 2 } }
]})

Portanto, isso usaria $size para garantir que, quando a matriz continha os dois elementos correspondentes, também havia apenas dois elementos. Qual é uma sintaxe melhor do que usar $or , especialmente para matrizes maiores.

E nas versões futuras, como mencionado, isso fica ainda mais limpo:
db.collection.find({ "$and": [ 
    { "members": { "$all": [ "some id 1", "some id 2" ] } },
    { "members": { "$size": 2 } }
]})

Isso cobre praticamente todas as interpretações