MongoDB: Cómo saber si $in es un objeto, no una matriz

CorePress2024-01-25  11

Digamos que tengo una serie de identificadores

[1, 2, 3]

Y estos registros

{"_id":"1",
 "tableName":"users",
 "recordId":{"id":"1"},
 "__v":0}

{"_id":"2",
 "tableName":"users",
 "recordId":{"id":"2"},
 "__v":0}

Ahora quiero encontrar registros cuyo recordId.id exista en la matriz de identificadores de arriba, ¿cómo puedo hacerlo? Como puede ver, el problema aquí es que recordId no es una matriz, por lo que puedo acceder a él directamente usando $in



------------------------------------

$in acepta una matriz de valores. No requiere que los valores de los campos en la base de datos sean de tipo matriz (aunque también funciona para valores de matriz almacenados). Su caso de uso se aborda en $in.



------------------------------------

La solución simple para esto es:

db.collection.find({ "recordId.id": { $in: arr_of_ids} });

Tenga en cuenta que, dado que en los registros proporcionados los identificadores se proporcionan como cadenas, debe pasar una matriz de identificadores de cadenas.



------------------------------------

Convierta su recordId.id a un número entero usando el operador $toInt. Compruebe si recordId.id existe en la matriz de identificadores utilizando el operador $in.

Prueba esto:

let ids = [1, 2, 3];

db.records.find({
    $expr: {
        $in: [{ $toInt: "$recordId.id" }, ids]
    }
})

2

const transQuery = { nombreTabla: tabla, "recordId.id": { $en: [ids] }, entidadId: entidadId }; ¿Se puede implementar así?

Usuario de PHP

28/03/2021 a las 14:09

No. En su caso, no puede usarlo porque primero necesita convertir recordId.id a int.

- Dheemanth Bhat

28/03/2021 a las 14:16

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare