Saya ingin menentukan tahap agregasi $ project di mana saya dapat menginstruksikannya untuk menambahkan bidang baru dan menyertakan semua bidang yang ada, tanpa harus mencantumkan semua bidang yang ada.
Dokumen saya terlihat seperti ini, dengan banyak bidang:
{
obj: {
obj_field1: "hi",
obj_field2: "hi2"
},
field1: "a",
field2: "b",
...
field26: "z"
}
Saya ingin membuat operasi agregasi seperti ini:
[
{
$project: {
custom_field: "$obj.obj_field1",
//the next part is that I don't want to do
field1: 1,
field2: 1,
...
field26: 1
}
},
... //group, match, and whatever...
]
Apakah ada sesuatu seperti kata kunci "sertakan semua bidang" yang dapat saya gunakan dalam kasus ini, atau cara lain untuk menghindari keharusan mencantumkan setiap bidang secara terpisah?
mongodb
mongodb-query
aggregation-framework
samuelluis.dll
sumber
sumber
Jawaban:
Di 4.2+, Anda dapat menggunakan
$set
operator pipeline agregasi yang tidak lain adalah alias untuk$addFields
ditambahkan di 3.4sumber
$addFields
baru di MongoDB 3.4 yang didukung oleh driver C # versiIAggregateFluent<TResult>.AppendStage(new JsonPipelineStageDefinition<TInput, TOutput>("{ $addFields : { myField: 'myValue' }}")
Anda dapat menggunakan $$ ROOT untuk mereferensikan dokumen root. Simpan semua bidang dokumen ini dalam satu bidang dan coba untuk mendapatkannya setelah itu (tergantung pada sistem klien Anda: Java, C ++, ...)
sumber
document
opsi untuk membuat satu dokumen gabungan akan lebih baik ...custom_field
terpasang.const newObj = { ...result.document, custom_field: result.custom_field }
>>> Ada sesuatu seperti kata kunci "sertakan semua bidang" yang dapat saya gunakan dalam kasus ini atau solusi lain?
Sayangnya, tidak ada operator yang "menyertakan semua kolom" dalam operasi agregasi. Satu-satunya alasan, mengapa, karena agregasi sebagian besar dibuat untuk mengelompokkan / menghitung data dari bidang koleksi (jumlah, rata-rata, dll.) Dan mengembalikan semua bidang kumpulan bukan tujuan langsung.
sumber
posts
dengan _id, judul, badan, bidang suka. Bidang suka adalah larik pengguna _id yang menyukai pos. Bagaimana Anda bisa membuat daftar semua posting dengan semua _id, title, body, likeCount? Mengembalikan semua bidang adalah tujuan langsung dalam kasus ini.Mulai versi 2.6.4, Mongo DB tidak memiliki fitur seperti itu untuk
$project
pipeline agregasi. Dari dokumen untuk$project
:dan
sumber
Untuk menambahkan bidang baru ke dokumen Anda, Anda dapat menggunakan
$addFields
dari dokumen
dan ke semua bidang di dokumen Anda, Anda dapat menggunakan
$$ROOT
sumber
menurut balasan @Deka, untuk c # mongodb driver 2.5 Anda bisa mendapatkan dokumen yang dikelompokkan dengan semua kunci seperti di bawah ini;
sumber