sql >> Base de Datos >  >> NoSQL >> MongoDB

Empuje el objeto a la matriz si la matriz existe; de ​​lo contrario, cree la matriz con el objeto en MongoDB

Para explicar todos los casos posibles aquí, considere cada caso de documento:

Si su documento para modificar se ve así:

{
    "_id": "efgh",
    "name": "Jerry"
}

Luego, una declaración de actualización como esta:

db.collection.update(
    { "_id": "efgh" },
    { "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)

Resultados en esto:

{
    "_id": "efgh",
    "name": "Jerry",
    "myArray": [
        {
            "field1": "abc",
            "field2": "def"
        }
    ]
}

Entonces se crea la matriz y se agrega el nuevo elemento.

Si su documento ya tiene una matriz como esta:

{
    "_id": "abcd",
    "name": "Tom",
    "myArray": [
        {
            "field1": "",
            "field2": ""
        }
    ]
}

Y haces básicamente la misma afirmación:

db.collection.update(
    { "_id": "abcd" },
    { "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)

Luego, el contenido del nuevo documento se agrega a la matriz existente:

{
    "_id": "abcd",
    "name": "Tom",
    "myArray": [
        {
            "field1": "",
            "field2": ""
        },
        {
            "field1": "abc",
            "field2": "def"
        }
    ]
}

Sin embargo, si su documento original tiene el campo nombrado pero no es una matriz, así:

{
    "_id": "efgh",
    "name": "Jerry",
    "myArray": 123
}

Luego, asegúrese de que no sea una matriz probando en la condición de consulta y usando $set en cambio:

db.collection.update(
    { "_id": "efgh", "myArray.0": { "$exists": false } },
    { "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)

Eso sobrescribirá de manera segura el elemento que no es una matriz (la notación de puntos "myArray.0" significa el primer elemento de la matriz, lo cual no es cierto) con una nueva matriz que contenga su contenido. El resultado es el mismo que el original:

{
    "_id": "efgh",
    "name": "Jerry",
    "myArray": [
        {
            "field1": "abc",
            "field2": "def"
        }
    ]
}