MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Inserisci l'oggetto nell'array se l'array esiste, altrimenti crea l'array con l'oggetto in MongoDB

Per spiegare tutti i casi possibili qui, considera ogni caso di documento:

Se il tuo documento da modificare ha questo aspetto:

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

Quindi una dichiarazione di aggiornamento come questa:

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

Risulta in questo:

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

Quindi l'array viene creato e il nuovo elemento aggiunto.

Se il tuo documento ha già un array come questo:

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

E fai praticamente la stessa affermazione:

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

Quindi il nuovo contenuto del documento viene aggiunto all'array esistente:

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

Se invece il tuo documento originale ha il campo con nome ma non è un array, come questo:

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

Quindi assicurati che non sia un array verificando nella condizione di query e utilizzando $set invece:

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

Ciò sovrascriverà in modo sicuro l'elemento che non è un array ( la notazione del punto "myArray.0" significa il primo elemento dell'array, che non è true ) con un nuovo array contenente il tuo contenuto. Il risultato è lo stesso dell'originale:

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