Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengemas kini dokumen menggunakan nilai dari tatasusunan dalaman

Bagaimana untuk mengemas kini dokumen menggunakan nilai dari tatasusunan dalaman

王林
王林ke hadapan
2024-02-10 11:09:09857semak imbas

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
}

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 ?
                },
            },
        }},
    }},
}

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>, ... },
   ...
}

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' }] },
          },
        },
      },
    },
  ]
);

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"}},
                    },
                },
            },
        },
    },
}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam