MongoDB selecionar onde na matriz de _id?


96

é possível no mongo db selecionar os documentos da coleção como no SQL:

SELECT * FROM collection WHERE _id IN (1,2,3,4);

ou se eu tiver um, _id arraydevo selecionar um por um e recompor os array/objectresultados?

Respostas:


171

Fácil :)

db.collection.find( { _id : { $in : [1,2,3,4] } } );

retirado de: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24in


Ainda obtemos benefícios da indexação? Nesse caso, os IDs são passados ​​como strings simples ...
Rafal Pastuszak

2
Você faz. No entanto, a complexidade do tempo é linear (n), não logarítmica / constante. Sem índice, seria n ^ 2.
Petr Brazdil

Não é O(log(n) * m)onde nestá o tamanho da coleção e mo número de ids passados?
Guig

8
Você tem que usar a função ObjectId, se "_id" é o objeto de ID - {_id: {$ in: [ObjectId ("5a633609670aeb6f93b88b23")]}}
Pax Beach

5

lista é uma matriz de ids

Nesta lista de códigos está a matriz de ids na coleção do usuário

var list = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"]

    .find({ _id: {$in : list}})

4
O código não está funcionando. Parece que foi necessário definir os IDs como ObjectId ("5883d387971bb840b7399130")
Pax Beach

1

Porque mongodb usa bsone para bson são tipos de atributos importantes. e porque _idé ObjectIdvocê deve usar assim:

db.collection.find( { _id : { $in : [ObjectId('1'),ObjectId('2')] } } );

e em mongodb compassuso como este:

{ "_id" : { $in : [ObjectId('1'),ObjectId('2')] } }

Nota: objectId na string tem 24comprimento.


0

se você quiser encontrar por usuário e também por outro campo como condicionalmente, você pode facilmente fazer como abaixo com spread e operador ternário usando aggregateematch

 const p_id = patient_id;
    let fetchingReports = await Reports.aggregate([
      ...(p_id
        ? [
            {
              $match: {
                createdBy: mongoose.Types.ObjectId(id),
                patient_id: p_id,
              },
            },
          ]
        : [
            {
              $match: {
                createdBy: mongoose.Types.ObjectId(id),
              },
            },
        

0

Você pode tentar isso

var ids = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"];

var oids = [];
ids.forEach(function(item){
oids.push(new ObjectId(item));
});

.find({ _id: {$in : oids}})

-4

Isso não está relacionado à consulta do mongo. Eu estava familiarizado com SQL e usei o Studio3T IDE para consultar um banco de dados mongo usando SQL. Se você for como eu, gostaria de salientar que o valor do id precisa ser marcado. Portanto, a consulta será semelhante a:

SELECT _id from <collectionName>
WHERE _id = ObjectId("5883d387971bb840b7399130");

2
Isso não resolve a questão de forma alguma.
Loctrice

Não responde, concordou. Isso pode ajudar com alguns IDE como Studio3T, que permite interagir com o mongoDB usando SQL. Aí a resposta tem aplicação. Além disso, é importante destacar que, mesmo nesse caso, o _id deve ser moldado por tipo.
sourabhxiii

1
é sobre mongodb
Rohit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.