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.
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
Saya membuat ini hanya untuk membuktikan, bahwa ini mungkin dengan Mongo v4. 2
Bagaimana cara menggunakan grup untuk banyak bidang di MongoDB?
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 } }.