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

Empurre o objeto para a matriz se a matriz existir, caso contrário, crie a matriz com o objeto no MongoDB


Para explicar todos os casos possíveis aqui, considere cada caso de documento:

Se o seu documento a ser alterado estiver assim:
{
    "_id": "efgh",
    "name": "Jerry"
}

Em seguida, uma declaração de atualização como esta:
db.collection.update(
    { "_id": "efgh" },
    { "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)

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

Assim, a matriz é criada e o novo item anexado.

Se o seu documento já tiver um array como este:
{
    "_id": "abcd",
    "name": "Tom",
    "myArray": [
        {
            "field1": "",
            "field2": ""
        }
    ]
}

E você faz basicamente a mesma declaração:
db.collection.update(
    { "_id": "abcd" },
    { "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)

Em seguida, o novo conteúdo do documento é anexado ao array existente:
{
    "_id": "abcd",
    "name": "Tom",
    "myArray": [
        {
            "field1": "",
            "field2": ""
        },
        {
            "field1": "abc",
            "field2": "def"
        }
    ]
}

Se, no entanto, seu documento original tiver o campo nomeado, mas não for uma matriz, assim:
{
    "_id": "efgh",
    "name": "Jerry",
    "myArray": 123
}

Em seguida, verifique se não é um array testando na condição de consulta e usando $set em vez de:
db.collection.update(
    { "_id": "efgh", "myArray.0": { "$exists": false } },
    { "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)

Isso substituirá com segurança o elemento que não é um array ( notação de ponto "myArray.0" significa primeiro elemento de array, o que não é true ) por um novo array contendo seu conteúdo. O resultado é o mesmo do original:
{
    "_id": "efgh",
    "name": "Jerry",
    "myArray": [
        {
            "field1": "abc",
            "field2": "def"
        }
    ]
}