Bagaimana untuk mengemas kini dokumen menggunakan nilai dari tatasusunan dalaman

王林
Lepaskan: 2024-02-10 11:09:09
ke hadapan
862 orang telah melayarinya

Bagaimana untuk mengemas kini dokumen menggunakan nilai dari tatasusunan dalaman

editor php Banana membawakan anda panduan praktikal tentang cara mengemas kini dokumen menggunakan nilai daripada tatasusunan dalaman. Semasa pembangunan, kita selalunya perlu mendapatkan data daripada tatasusunan dan mengemas kininya ke dalam dokumen. Artikel ini akan memperkenalkan cara menggunakan nilai dalam tatasusunan dalaman PHP untuk mengemas kini dokumen Kaedah ini mudah dan fleksibel, dan boleh membantu kami mengendalikan tugas kemas kini data dengan lebih cekap. Sama ada anda seorang pemula atau pembangun yang berpengalaman, saya harap artikel ini dapat membawa anda beberapa pengetahuan dan petua yang berharga. Mari mulakan segera!

Isi soalan

Saya terperangkap pada sesuatu yang nampaknya tidak rumit, mungkin ada sesuatu yang saya tidak terfikir atau tidak nampak.

Mempunyai (banyak) dokumen yang mengandungi tatasusunan objek, contohnya:

{
    "_id": "ox1",
    "results": [
        {
            "id": "a1",
            "somethingelse": "aa",
            "value": 1
        },
        {
            "id": "a2",
            "somethingelse": "bb",
            "value": 2
        },
        {
            "id": "a3",
            "somethingelse": "cc",
            "value": 3
        }
    ],
    "total": 0
},
{
    "_id": "ox2",
    "results": [
        {
            "id": "a1",
            "somethingelse": "aa",
            "value": 44
        },
        {
            "id": "a4",
            "somethingelse": "bb",
            "value": 4
        },
        {
            "id": "a5",
            "somethingelse": "aa",
            "value": 5
        }
    ],
    "total": 0
},
{
    "_id": "ox3",
    "results": [
        {
            "id": "a2",
            "somethingelse": "aa",
            "value": 1
        },
        {
            "id": "a3",
            "somethingelse": "aa",
            "value": 4
        },
        {
            "id": "a4",
            "somethingelse": "aa",
            "value": 5
        }
    ],
    "total": 0
}
Salin selepas log masuk

Saya mahu kemas kini banyak pertanyaan untuk mengemas kini semua dokumen dengan "hasil" yang mengandungi:

  • "id":"a1"
  • "somethingelse": "aa"

Tingkatkan "jumlah"nya dengan nilai "hasil" yang mengandungi "id": "a1" dan "somethingelse": "aa"

Jadi dalam contoh kami: Hasil untuk "0x1" mengandungi "id": "a1" dan "somethingelse": "aa" mempunyai "nilai" 1 -> Saya mahu "jumlah"nya meningkat sebanyak 1

Hasil untuk "0x2" mengandungi "id": "a1" dan "somethingelse": "aa" mempunyai "nilai" 44 -> Saya mahu "jumlah"nya meningkat sebanyak 44

"0x3" tidak menepati syarat

Ditulis dalam go, ia bermula seperti ini:

// Here I filter only the documents meeting the condition
filter := bson.D{{
    Key: "results,
    Value: bson.D{{
        Key: "$elemMatch",
        Value: bson.D{
            {Key: "id", Value: "a1"},
            {Key: "somethingElse", Value: "aa"},
        }},
    }},
}

// This is where it gets tricky
addTotal := bson.M{
    "$set": bson.D{{
        Key: "total",
        Value: bson.D{{
            Key: "$sum",
            Value: bson.A{
                "$total",
                bson.M{ 
                    // How can I get the "value" from the right object from the array ?
                },
            },
        }},
    }},
}
Salin selepas log masuk

Adakah ini mungkin? Saya tidak menemui banyak maklumat tentang pertanyaan dalaman/terbenam.

Penyelesaian

db.collection.updatemany(filter, update, options) 中的 update Parameter boleh menjadi dokumen kemas kini atau saluran paip pengagregatan (doc).

Kemas kini dokumen hanya mengandungi kemas kini ungkapan operator, yang kelihatan seperti ini:

{
   <operator1>: { <field1>: <value1>, ... },
   <operator2>: { <field2>: <value2>, ... },
   ...
}
Salin selepas log masuk

Nilai tidak boleh merujuk medan dalam dokumen.

Walaupun saluran paip agregasi lebih maju dan boleh merujuk medan dalam dokumen. Berikut ialah satu cara untuk melakukannya menggunakan saluran paip pengagregatan:

db.collection.updatemany(
  { results: { $elemmatch: { id: 'a1', somethingelse: 'aa' } } },
  [
    {
      $set: {
        total: {
          $let: {
            vars: {
              items: {
                $filter: {
                  input: '$results',
                  as: 'item',
                  cond: {
                    $and: [
                      { $eq: ['$$item.id', 'a1'] },
                      { $eq: ['$$item.somethingelse', 'aa'] },
                    ],
                  },
                },
              },
            },
            in: { $add: ['$total', { $sum: '$$items.value' }] },
          },
        },
      },
    },
  ]
);
Salin selepas log masuk

Diterjemah ke dalam kod go:

filter := bson.M{
    "results": bson.M{
        "$elemMatch": bson.M{
            "id":            "a1",
            "somethingElse": "aa",
        },
    },
}

vars := bson.M{
    "items": bson.M{
        "$filter": bson.M{
            "input": "$results",
            "as":    "item",
            "cond": bson.M{
                "$and": bson.A{
                    bson.M{"$eq": bson.A{"$$item.id", "a1"}},
                    bson.M{"$eq": bson.A{"$$item.somethingElse", "aa"}},
                },
            },
        },
    },
}

update := bson.A{
    bson.M{
        "$set": bson.M{
            "total": bson.M{
                "$let": bson.M{
                    "vars": vars,
                    "in": bson.M{
                        "$add": bson.A{"$total", bson.M{"$sum": "$$items.value"}},
                    },
                },
            },
        },
    },
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mengemas kini dokumen menggunakan nilai dari tatasusunan dalaman. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!