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

Skub objekt ind i array, hvis arrayet eksisterer, ellers opret arrayet med objekt i MongoDB

For at forklare alle de mulige sager her, skal du overveje hver dokumentsag:

Hvis dit dokument, der skal ændres, ser sådan ud:

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

Så en opdateringserklæring som denne:

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

Dette resulterer i:

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

Så arrayet oprettes og det nye element tilføjes.

Hvis dit dokument allerede har et array som dette:

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

Og du gør stort set det samme udsagn:

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

Derefter føjes det nye dokumentindhold til det eksisterende array:

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

Hvis dit originale dokument har det navngivne felt, men det ikke er et array, som dette:

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

Sørg derefter for, at det ikke er et array ved at teste i forespørgselstilstanden og bruge $set i stedet:

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

Det vil sikkert overskrive det element, der ikke er et array (punktnotation "myArray.0" betyder det første array-element, hvilket ikke er sandt) med et nyt array, der indeholder dit indhold. Resultatet er det samme som originalen:

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


  1. Hvordan opretter jeg en resque worker automatisk ved opstart?

  2. Mongoose-forespørgsler om datotilstand har ingen resultater, MongoDB Shell virker

  3. MongoDB sorterer dokumenter efter array-elementer

  4. MongoDB-opslag, når fremmedfelt er en række objekter