Grup mongodb mengembalikan semua bidang

bagaimana jika data berisi beberapa array. Sebagai contoh

/* 1 */
{
  "_id": "1",
  "d": [{ "element1": 1.1 }, { "element2": 1.2 }],
  "c": [{ "element1": 2.1 }],
  "b": [{ "element1": 3.1 }, { "element2": 3.1 }],
  "a": false
}
/* 2 */
{
    "_id" : "2",
    "a" : [{ "element1": 1.1.2 }]
} 

Keluaran yang Diperlukan
{
"_Indo". “1”,
"d". [{ "elemen1". 1. 1 }, {"elemen2". 1. 2}],
"c". [{ "elemen1". 2. 1 }, {"elemen2". nol}],
"b". [{ "elemen1". 3. 1 }, {"elemen2". 3. 1 }],
"sebuah". Salah
}
{
"_Indo". “2”,
"d". [{ "elemen1". null }, {"elemen2". nol}],
"c". [{ "elemen1". null }, {"elemen2". nol}],
"b". [{ "elemen1". null }, {"elemen2". nol}],
"sebuah". [{ "elemen1". 1. 1. 2 }, {"elemen2". nol}]
}

Bagaimana tampilan kueri?

Terima kasih untuk bantuannya

Saya ingin memilih ctype/cname/pname yang berbeda untuk instrumen tertentu dan rentang tanggal (fromDate, toDate)

Dalam SQL, kueri yang akan saya lakukan adalah

SELECT DISTINCT(ctype, cname, pname) 
    FROM histoValues
        WHERE (timestamp >= fromDate and timeStamp <= toDate) 
        AND instrument = 35
        GROUP BY ctype, cname, pname
_

Di alat MongoDB Compass, saya pertama kali mencoba mengelompokkan ctype, tanpa $match
Dalam SQL itu akan menjadi
PILIH BERBEDA (ctype)
DARI histoValues
GROUP BY ctype

Di Kompas, saya menggunakan operator agregasi $group dan masuk

{
_Indo. “$ctype”
}

Di jendela “output after $group stage”, ada hasil sebagai berikut

_Indo. "Sumbu"

sementara saya memiliki tiga nilai ctype berbeda dalam koleksi saya

Apa yang saya lakukan salah?

Dan bagaimana cara menambahkan bidang di operator $group saya?

Terima kasih banyak atas bantuan Anda

apakah ada cara umum untuk menulis sesuatu seperti mengulang sisa bidang (selain pengelompokan)?

Untuk permintaan gila - solusi gila.

Grup mongodb mengembalikan semua bidang

db.test.aggregate([
 {
   $group: {
     // specify group-by fields here
     _id: {
       x: '$x',
       y: '$y',
       z: '$z',
     },
     docsEntries: {
       $push: {
         $objectToArray: '$$CURRENT',
       },
     },
   },
 },
 {
   $addFields: {
     docKeysList: {
       $map: {
         input: {
           $arrayElemAt: ['$docsEntries', 0],
         },
         in: '$$this.k',
       },
     },
   },
 },
 {
   $addFields: {
     // gather fields, values of which we will sum-up
     filteredKeyList: {
       $filter: {
         input: '$docKeysList',
         cond: {
           $not: {
             // specify ignored fields, that you do not want to calculate
             // at minimum, here should be _id and grouping keys
             $in: ['$$this', ['_id', 'x', 'y', 'z']],
           },
         },
       },
     },
   },
 },
 {
   $addFields: {
     // collect all entries (values of same key from all docs in the group)
     // in the single array
     groupedEntries: {
       $map: {
         input: '$filteredKeyList',
         as: 'filteredKey',
         in: {
           $reduce: {
             input: '$docsEntries',
             initialValue: [],
             in: {
               $let: {
                 vars: {
                   targetDocEntry: {
                     $filter: {
                       input: '$$this',
                       as: 'docEntry',
                       cond: {
                         $eq: ['$$docEntry.k', '$$filteredKey'],
                       },
                     },
                   },
                 },
                 in: {
                   $concatArrays: ['$$value', '$$targetDocEntry'],
                 },
               },
             },
           },
         },
       },
     },
   },
 },
 {
   $addFields: {
     calculatedEntries: {
       $map: {
         // we need to ned to return { k, v } for each key, so we can
         // transform it to single object with custom prop names
         input: '$groupedEntries',
         as: 'groupedEntry',
         in: {
           k: {
             $let: {
               vars: {
                 item: {
                   $arrayElemAt: ['$$groupedEntry', 0],
                 },
               },
               in: {
                 // here the custom prop name is calculated
                 // feel free to change the logic if needed
                 $concat: ['total_', '$$item.k'],
               },
             },
           },
           v: {
             $reduce: {
               input: '$$groupedEntry',
               initialValue: 0,
               in: {
                 $add: ['$$value', {
                   $convert: {
                     input: '$$this.v',
                     to: 'double',
                     // Change NaN to 0 for onError prop,
                     // if your props can contain various value types
                     // and you cant to calculate only number values
                     // for every document field
                     onError: NaN,
                     onNull: 0,
                   },
                 }],
               },
             },
           },
         },
       },
     },
   },
 },
 {
   $addFields: {
     results: {
       $arrayToObject: '$calculatedEntries',
     },
   },
 },
 {
   $project: {
     results: true,
   },
 },
]).pretty();

Dan untuk dokumen berikut

db.test.insertMany([
  { x: 1, y: 1, z: 1, propA: 5, propB: '5', propC: 't5' },
  { x: 1, y: 1, z: 2, propA: 10, propB: '10', propC: 't10' },
  { x: 1, y: 1, z: 2, propA: 15, propB: '15', propC: 't15' },
]);

Agregasi akan kembali

[
  {
    "_id" : {
      "x" : 1,
      "y" : 1,
      "z" : 1
    },
    "results" : {
      "total_propA" : 5,
      "total_propB" : 5,
      "total_propC" : NaN
    },
  },
  {
    "_id" : {
      "x" : 1,
      "y" : 1,
      "z" : 2
    },
    "results" : {
      "total_propA" : 25,
      "total_propB" : 25,
      "total_propC" : NaN
    },
  },
]
_

Solusinya tidak ideal dan bisa diperbaiki, tapi itu cerita gila lainnya

Grup mongodb mengembalikan semua bidang

Saya membuat ini hanya untuk membuktikan, bahwa ini mungkin dengan Mongo v4. 2

Bagaimana cara menggunakan grup untuk banyak bidang di MongoDB?

Contoh 3. Grup BUCKET MongoDb oleh Berbagai Bidang . Agregasi ember adalah proses mengkategorikan dokumen ke dalam grup. Grup ini bertindak seperti ember. Setiap dokumen dibagi tergantung pada ekspresi tertentu. creating the bucket aggregation. Bucket aggregation is the process of categorizing the documents into groups. This group acts like buckets. Each document is divided depending on the specific expression.

Mengapa kita menggunakan $group di MongoDB?

Tahap $group memisahkan dokumen ke dalam grup berdasarkan "kunci grup" . Outputnya adalah satu dokumen untuk setiap kunci grup unik. Kunci grup sering berupa bidang, atau grup bidang. Kunci grup juga bisa menjadi hasil ekspresi.

Bagaimana cara menggunakan grup dengan klausa di MongoDB?

Kita dapat mengelompokkan berdasarkan satu atau beberapa bidang dari koleksi, kita dapat menggunakan $group operator di MongoDB untuk mengelompokkan bidang dari koleksi dan mengembalikan dokumen baru sebagai hasilnya< . Kami menggunakan operator $avg, $sum, $max, $min, $push, $last, $first dan $addToSet dengan group by di MongoDB. . We are using $avg, $sum, $max, $min, $push, $last, $first and $addToSet operator with group by in MongoDB.

Bagaimana cara menampilkan bidang di MongoDB?

Gunakan notasi titik untuk merujuk ke bidang tersemat dalam dokumen proyeksi dan setel ke 0 . Mulai di MongoDB 4. 4, Anda juga dapat menentukan bidang yang disematkan menggunakan formulir bersarang, mis. g. { ukuran. {uom. 0 } }.