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!
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:
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.
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!