MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Poussez l'objet dans le tableau si le tableau existe, sinon créez le tableau avec l'objet dans MongoDB

Pour expliquer tous les cas possibles ici, considérons chaque cas de document :

Si votre document à modifier ressemble à ceci :

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

Ensuite, une déclaration de mise à jour comme celle-ci :

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

Résultats dans ceci :

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

Ainsi, le tableau est créé et le nouvel élément ajouté.

Si votre document contient déjà un tableau comme celui-ci :

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

Et vous faites essentiellement la même déclaration :

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

Ensuite, le nouveau contenu du document est ajouté au tableau existant :

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

Si toutefois votre document d'origine contient le champ nommé mais qu'il ne s'agit pas d'un tableau, comme ceci :

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

Assurez-vous ensuite qu'il ne s'agit pas d'un tableau en testant dans la condition de requête et en utilisant $set à la place :

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

Cela écrasera en toute sécurité l'élément qui n'est pas un tableau (notation par points "myArray.0" signifie premier élément du tableau, qui n'est pas vrai) avec un nouveau tableau contenant votre contenu. Le résultat est le même que l'original :

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