Is there a way to merge textures in Unity in a shader? - unity3d

I'm trying to animate a 2D game object using several overlaid layers of images in one mesh renderer. I've got several layers of different textures, each is an image with a transparent background.
I've found a way to programmatically create a rectangular mesh and layer the materials within it with UV mapping. Unfortunately Unity now has to render each of these material layers separately, despite the fact that they are all within one mesh. This results in a very inefficient number of draw calls. I can see that each material now has it's own shader as well.
Will I need to edit all of my images into one gigantic image outside of Unity and display portions of them using UV mapping in a single material within the mesh?
Or is there some way to achieve this with a shader?

Create your own Shader (Code or ShaderGraph). Shaders can render multiple Textures (layers). You can blend by alpha/transprency however you like.
Edit: Example in ShaderGraph:
ShaderGraph Code:
https://pastebin.com/a8ubgxRP
application/vnd.unity.graphview.elements {
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.CopyPasteGraph",
"m_ObjectId": "82a0e513542e4106ae94a0ba8a6ec750",
"m_Edges": [
{
"m_OutputSlot": {
"m_Node": {
"m_Id": "a58e7e104e604e0b9e2961da5510e2bf"
},
"m_SlotId": 0
},
"m_InputSlot": {
"m_Node": {
"m_Id": "5e1616a6e87c470f8e3520b520b86bea"
},
"m_SlotId": 1
}
},
{
"m_OutputSlot": {
"m_Node": {
"m_Id": "5e1616a6e87c470f8e3520b520b86bea"
},
"m_SlotId": 0
},
"m_InputSlot": {
"m_Node": {
"m_Id": "b9bc9d71a2354d1ebadb93dab18e7223"
},
"m_SlotId": 0
}
},
{
"m_OutputSlot": {
"m_Node": {
"m_Id": "e5668fa7ac4e42fdaa32049802bd78b2"
},
"m_SlotId": 0
},
"m_InputSlot": {
"m_Node": {
"m_Id": "a275a2c058614973b0efd13817919cc6"
},
"m_SlotId": 1
}
},
{
"m_OutputSlot": {
"m_Node": {
"m_Id": "a275a2c058614973b0efd13817919cc6"
},
"m_SlotId": 0
},
"m_InputSlot": {
"m_Node": {
"m_Id": "b9bc9d71a2354d1ebadb93dab18e7223"
},
"m_SlotId": 1
}
},
{
"m_OutputSlot": {
"m_Node": {
"m_Id": "a275a2c058614973b0efd13817919cc6"
},
"m_SlotId": 7
},
"m_InputSlot": {
"m_Node": {
"m_Id": "b9bc9d71a2354d1ebadb93dab18e7223"
},
"m_SlotId": 3
}
}
],
"m_Nodes": [
{
"m_Id": "5e1616a6e87c470f8e3520b520b86bea"
},
{
"m_Id": "a275a2c058614973b0efd13817919cc6"
},
{
"m_Id": "e5668fa7ac4e42fdaa32049802bd78b2"
},
{
"m_Id": "b9bc9d71a2354d1ebadb93dab18e7223"
},
{
"m_Id": "a58e7e104e604e0b9e2961da5510e2bf"
}
],
"m_Groups": [],
"m_StickyNotes": [],
"m_Inputs": [],
"m_MetaProperties": [],
"m_MetaPropertyIds": [],
"m_MetaKeywords": [],
"m_MetaKeywordIds": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
"m_ObjectId": "09a8291e17ab424e8149728df0325ac7",
"m_Id": 5,
"m_DisplayName": "G",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "G",
"m_StageCapability": 2,
"m_Value": 0.0,
"m_DefaultValue": 0.0,
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
"m_ObjectId": "09adddb00a6a45ba89f015d46cc7e777",
"m_Id": 5,
"m_DisplayName": "G",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "G",
"m_StageCapability": 2,
"m_Value": 0.0,
"m_DefaultValue": 0.0,
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot",
"m_ObjectId": "254965f8ab4b456789bf3701f105035f",
"m_Id": 0,
"m_DisplayName": "RGBA",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "RGBA",
"m_StageCapability": 2,
"m_Value": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
},
"m_DefaultValue": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
},
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
"m_ObjectId": "394d8ab6d6254442a22a1d2a1d393090",
"m_Id": 4,
"m_DisplayName": "R",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "R",
"m_StageCapability": 2,
"m_Value": 0.0,
"m_DefaultValue": 0.0,
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode",
"m_ObjectId": "5e1616a6e87c470f8e3520b520b86bea",
"m_Group": {
"m_Id": ""
},
"m_Name": "Sample Texture 2D",
"m_DrawState": {
"m_Expanded": true,
"m_Position": {
"serializedVersion": "2",
"x": -1229.6002197265625,
"y": -552.0,
"width": 208.0000762939453,
"height": 433.6000061035156
}
},
"m_Slots": [
{
"m_Id": "7f1789f703db4759a2c2cbbdcee37bb7"
},
{
"m_Id": "fdbf06e354c64748bc51ee1f630dec56"
},
{
"m_Id": "09a8291e17ab424e8149728df0325ac7"
},
{
"m_Id": "e3d48a7642ee490d9e52742319616c2a"
},
{
"m_Id": "6ea82df60cc64a08a6d75d13343fa8b3"
},
{
"m_Id": "fcc275cddbd44f6491e5c6752757e36f"
},
{
"m_Id": "6f90ea7d44914d0985b264b8fdd91f89"
},
{
"m_Id": "f9c9786a2bcd475d9ad02b23429c97f6"
}
],
"synonyms": [],
"m_Precision": 0,
"m_PreviewExpanded": true,
"m_PreviewMode": 0,
"m_CustomColors": {
"m_SerializableColors": []
},
"m_TextureType": 0,
"m_NormalMapSpace": 0
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot",
"m_ObjectId": "5f0e671f32cf47cda2dbaf52f3591216",
"m_Id": 2,
"m_DisplayName": "Out",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "Out",
"m_StageCapability": 3,
"m_Value": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
},
"m_DefaultValue": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
}
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot",
"m_ObjectId": "69f238b9d6ec46009f9ad1e06532c289",
"m_Id": 0,
"m_DisplayName": "Out",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "Out",
"m_StageCapability": 3,
"m_BareResource": false
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
"m_ObjectId": "6a74085b28a4494f9928fbde7bb14ab4",
"m_Id": 6,
"m_DisplayName": "B",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "B",
"m_StageCapability": 2,
"m_Value": 0.0,
"m_DefaultValue": 0.0,
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
"m_ObjectId": "6ea82df60cc64a08a6d75d13343fa8b3",
"m_Id": 7,
"m_DisplayName": "A",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "A",
"m_StageCapability": 2,
"m_Value": 0.0,
"m_DefaultValue": 0.0,
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot",
"m_ObjectId": "6f90ea7d44914d0985b264b8fdd91f89",
"m_Id": 2,
"m_DisplayName": "UV",
"m_SlotType": 0,
"m_Hidden": false,
"m_ShaderOutputName": "UV",
"m_StageCapability": 3,
"m_Value": {
"x": 0.0,
"y": 0.0
},
"m_DefaultValue": {
"x": 0.0,
"y": 0.0
},
"m_Labels": [],
"m_Channel": 0
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot",
"m_ObjectId": "7d86c10d04514f1db34f1c03b5e0d07a",
"m_Id": 0,
"m_DisplayName": "Base",
"m_SlotType": 0,
"m_Hidden": false,
"m_ShaderOutputName": "Base",
"m_StageCapability": 3,
"m_Value": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
},
"m_DefaultValue": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
}
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot",
"m_ObjectId": "7f1789f703db4759a2c2cbbdcee37bb7",
"m_Id": 0,
"m_DisplayName": "RGBA",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "RGBA",
"m_StageCapability": 2,
"m_Value": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
},
"m_DefaultValue": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
},
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot",
"m_ObjectId": "9cf09bc550a4468faa6908e33854182c",
"m_Id": 0,
"m_DisplayName": "Out",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "Out",
"m_StageCapability": 3,
"m_BareResource": false
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot",
"m_ObjectId": "9f7246d6f2f84e50a35232a424585f47",
"m_Id": 2,
"m_DisplayName": "UV",
"m_SlotType": 0,
"m_Hidden": false,
"m_ShaderOutputName": "UV",
"m_StageCapability": 3,
"m_Value": {
"x": 0.0,
"y": 0.0
},
"m_DefaultValue": {
"x": 0.0,
"y": 0.0
},
"m_Labels": [],
"m_Channel": 0
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode",
"m_ObjectId": "a275a2c058614973b0efd13817919cc6",
"m_Group": {
"m_Id": ""
},
"m_Name": "Sample Texture 2D",
"m_DrawState": {
"m_Expanded": true,
"m_Position": {
"serializedVersion": "2",
"x": -1236.8001708984375,
"y": -95.99998474121094,
"width": 208.00001525878907,
"height": 433.6000061035156
}
},
"m_Slots": [
{
"m_Id": "254965f8ab4b456789bf3701f105035f"
},
{
"m_Id": "394d8ab6d6254442a22a1d2a1d393090"
},
{
"m_Id": "09adddb00a6a45ba89f015d46cc7e777"
},
{
"m_Id": "6a74085b28a4494f9928fbde7bb14ab4"
},
{
"m_Id": "de7a0347276243dca2e037c26fdd8b82"
},
{
"m_Id": "f18732f84c8f40849bb8eb7fc6d31fb6"
},
{
"m_Id": "9f7246d6f2f84e50a35232a424585f47"
},
{
"m_Id": "f08fa5b4eede46afad513c1f5cb4539e"
}
],
"synonyms": [],
"m_Precision": 0,
"m_PreviewExpanded": true,
"m_PreviewMode": 0,
"m_CustomColors": {
"m_SerializableColors": []
},
"m_TextureType": 0,
"m_NormalMapSpace": 0
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Texture2DAssetNode",
"m_ObjectId": "a58e7e104e604e0b9e2961da5510e2bf",
"m_Group": {
"m_Id": ""
},
"m_Name": "Texture 2D Asset",
"m_DrawState": {
"m_Expanded": true,
"m_Position": {
"serializedVersion": "2",
"x": -1484.8001708984375,
"y": -556.7999877929688,
"width": 145.5999755859375,
"height": 105.59998321533203
}
},
"m_Slots": [
{
"m_Id": "9cf09bc550a4468faa6908e33854182c"
}
],
"synonyms": [],
"m_Precision": 0,
"m_PreviewExpanded": true,
"m_PreviewMode": 0,
"m_CustomColors": {
"m_SerializableColors": []
},
"m_Texture": {
"m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}",
"m_Guid": ""
}
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot",
"m_ObjectId": "aee1f01a0a34437095d6a66540ce346f",
"m_Id": 1,
"m_DisplayName": "Blend",
"m_SlotType": 0,
"m_Hidden": false,
"m_ShaderOutputName": "Blend",
"m_StageCapability": 3,
"m_Value": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
},
"m_DefaultValue": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 0.0
}
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.BlendNode",
"m_ObjectId": "b9bc9d71a2354d1ebadb93dab18e7223",
"m_Group": {
"m_Id": ""
},
"m_Name": "Blend",
"m_DrawState": {
"m_Expanded": true,
"m_Position": {
"serializedVersion": "2",
"x": -852.800048828125,
"y": -306.3999938964844,
"width": 208.00001525878907,
"height": 360.0
}
},
"m_Slots": [
{
"m_Id": "7d86c10d04514f1db34f1c03b5e0d07a"
},
{
"m_Id": "aee1f01a0a34437095d6a66540ce346f"
},
{
"m_Id": "c868501ed3c14206b2d478b0ceb706bf"
},
{
"m_Id": "5f0e671f32cf47cda2dbaf52f3591216"
}
],
"synonyms": [],
"m_Precision": 0,
"m_PreviewExpanded": true,
"m_PreviewMode": 0,
"m_CustomColors": {
"m_SerializableColors": []
},
"m_BlendMode": 21
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
"m_ObjectId": "c868501ed3c14206b2d478b0ceb706bf",
"m_Id": 3,
"m_DisplayName": "Opacity",
"m_SlotType": 0,
"m_Hidden": false,
"m_ShaderOutputName": "Opacity",
"m_StageCapability": 3,
"m_Value": 1.0,
"m_DefaultValue": 1.0,
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
"m_ObjectId": "de7a0347276243dca2e037c26fdd8b82",
"m_Id": 7,
"m_DisplayName": "A",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "A",
"m_StageCapability": 2,
"m_Value": 0.0,
"m_DefaultValue": 0.0,
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
"m_ObjectId": "e3d48a7642ee490d9e52742319616c2a",
"m_Id": 6,
"m_DisplayName": "B",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "B",
"m_StageCapability": 2,
"m_Value": 0.0,
"m_DefaultValue": 0.0,
"m_Labels": []
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Texture2DAssetNode",
"m_ObjectId": "e5668fa7ac4e42fdaa32049802bd78b2",
"m_Group": {
"m_Id": ""
},
"m_Name": "Texture 2D Asset",
"m_DrawState": {
"m_Expanded": true,
"m_Position": {
"serializedVersion": "2",
"x": -1501.6002197265625,
"y": -96.79998779296875,
"width": 145.60009765625,
"height": 105.5999984741211
}
},
"m_Slots": [
{
"m_Id": "69f238b9d6ec46009f9ad1e06532c289"
}
],
"synonyms": [],
"m_Precision": 0,
"m_PreviewExpanded": true,
"m_PreviewMode": 0,
"m_CustomColors": {
"m_SerializableColors": []
},
"m_Texture": {
"m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}",
"m_Guid": ""
}
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot",
"m_ObjectId": "f08fa5b4eede46afad513c1f5cb4539e",
"m_Id": 3,
"m_DisplayName": "Sampler",
"m_SlotType": 0,
"m_Hidden": false,
"m_ShaderOutputName": "Sampler",
"m_StageCapability": 3,
"m_BareResource": false
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot",
"m_ObjectId": "f18732f84c8f40849bb8eb7fc6d31fb6",
"m_Id": 1,
"m_DisplayName": "Texture",
"m_SlotType": 0,
"m_Hidden": false,
"m_ShaderOutputName": "Texture",
"m_StageCapability": 3,
"m_BareResource": false,
"m_Texture": {
"m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}",
"m_Guid": ""
},
"m_DefaultType": 0
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot",
"m_ObjectId": "f9c9786a2bcd475d9ad02b23429c97f6",
"m_Id": 3,
"m_DisplayName": "Sampler",
"m_SlotType": 0,
"m_Hidden": false,
"m_ShaderOutputName": "Sampler",
"m_StageCapability": 3,
"m_BareResource": false
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot",
"m_ObjectId": "fcc275cddbd44f6491e5c6752757e36f",
"m_Id": 1,
"m_DisplayName": "Texture",
"m_SlotType": 0,
"m_Hidden": false,
"m_ShaderOutputName": "Texture",
"m_StageCapability": 3,
"m_BareResource": false,
"m_Texture": {
"m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}",
"m_Guid": ""
},
"m_DefaultType": 0
}
{
"m_SGVersion": 0,
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
"m_ObjectId": "fdbf06e354c64748bc51ee1f630dec56",
"m_Id": 4,
"m_DisplayName": "R",
"m_SlotType": 1,
"m_Hidden": false,
"m_ShaderOutputName": "R",
"m_StageCapability": 2,
"m_Value": 0.0,
"m_DefaultValue": 0.0,
"m_Labels": []
}

Related

MongoDB aggregation re-group deep nested array of objects

Good day all,
I need some help figuring out this aggregation issue. I have a document with nested arrays where I want to perform lookups on the nested array's values after which I want to restore the document to its original structure. see below:
[
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
"plan": {
"field_we": 1,
"field_da": 1,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W111",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 3736,
"nbr_exe": 8,
"target_mus": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 16,
"description": "Tricerus"
},
{
"itemID": 5,
"description": "Chiwawak"
}
],
"target_are": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 4,
"description": "Chiwawak"
},
{
"itemID": 2,
"description": "Amanus"
}
],
"items": {
"itemid": 44,
"target_are": [
{
"itemID": 4,
"description": "Chiwawak"
}
],
"target_mus": [
{
"itemID": 5,
"description": "Chiwawak"
}
],
"nbr_ref": 4,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 520,
"_id": "63ca9b798d47745ae5589906",
"status": 0,
"pct_complete": 0,
"set": []
},
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca95368d47745ae558985e"
},
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
},
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
"plan": {
"field_we": 1,
"field_da": 1,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W111",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 3736,
"nbr_exe": 8,
"target_mus": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 16,
"description": "Tricerus"
},
{
"itemID": 5,
"description": "Chiwawak"
}
],
"target_are": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 4,
"description": "Chiwawak"
},
{
"itemID": 2,
"description": "Amanus"
}
],
"items": {
"itemid": 339,
"target_are": [
{
"itemID": 4,
"description": "Chiwawak"
}
],
"target_mus": [
{
"itemID": 5,
"description": "Chiwawak"
}
],
"nbr_ref": 3,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 390,
"_id": "63ca9b798d47745ae5589907",
"status": 0,
"pct_complete": 0,
"set": []
},
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca95368d47745ae558985e"
},
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
},
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
"plan": {
"field_we": 1,
"field_da": 2,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W121",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 2674,
"nbr_exe": 6,
"target_mus": [
{
"itemID": 9,
"description": "Lats"
},
{
"itemID": 10,
"description": "Lower Back"
},
{
"itemID": 11,
"description": "Middle Back"
}
],
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"items": {
"itemid": 47,
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"target_mus": [
{
"itemID": 10,
"description": "Lower Back"
}
],
"nbr_ref": 4,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 520,
"_id": "63caa1568d47745ae5589b25",
"status": 0,
"pct_complete": 0,
"set": []
},
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca9b8e8d47745ae558994b"
},
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
},
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
"plan": {
"field_we": 1,
"field_da": 2,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W121",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 2674,
"nbr_exe": 6,
"target_mus": [
{
"itemID": 9,
"description": "Lats"
},
{
"itemID": 10,
"description": "Lower Back"
},
{
"itemID": 11,
"description": "Middle Back"
}
],
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"items": {
"itemid": 495,
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"target_mus": [
{
"itemID": 11,
"description": "Middle Back"
}
],
"nbr_ref": 3,
"int_rec": "10~12",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 414,
"_id": "63caa1568d47745ae5589b26",
"status": 0,
"pct_complete": 0,
"set": []
},
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca9b8e8d47745ae558994b"
},
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
},
{
......
}
]
Now i want to get the document back to this structure using aggregation.
{
"_id": "63c7fec2fe9afea23afdbcef",
"primary_language": "en",
"image_link": "avatar_image_linl",
"description": ["Some description text here"],
"source": "community",
"standard": "imperial",
"gender": "male",
"base_a": 47,
"base_w": 220,
"base_h": 71.65,
"status": "draft",
"date_created": "2023-01-18T14:14:26.201Z",
"product_plan": {
"p_len": 4,
"p_fre": 1,
"p_qua": 4,
"avg_len": 3583,
"total_wor": 16,
"total_exe": 128,
// Group plan here by product_plan._id
"plan": [
{
"field_we": 1,
"field_da": 1,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W111",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 3736,
"nbr_exe": 8,
"target_mus": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 16,
"description": "Tricerus"
},
{
"itemID": 5,
"description": "Chiwawak"
}
],
"target_are": [
{
"itemID": 1,
"description": "Adominorus"
},
{
"itemID": 4,
"description": "Chiwawak"
},
{
"itemID": 2,
"description": "Amanus"
}
],
// group items by plan._id
"items": [
{
"itemid": 44,
"target_are": [
{
"itemID": 4,
"description": "Chiwawak"
}
],
"target_mus": [
{
"itemID": 5,
"description": "Chiwawak"
}
],
"nbr_ref": 4,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 520,
"_id": "63ca9b798d47745ae5589906",
"status": 0,
"pct_complete": 0,
"set": []
},
{
"itemid": 339,
"target_are": [
{
"itemID": 4,
"description": "Chiwawak"
}
],
"target_mus": [
{
"itemID": 5,
"description": "Chiwawak"
}
],
"nbr_ref": 3,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 390,
"_id": "63ca9b798d47745ae5589907",
"status": 0,
"pct_complete": 0,
"set": []
},
],
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca95368d47745ae558985e"
},
{
"field_we": 1,
"field_da": 2,
"field_ti": 1,
"field_rest_we": false,
"field_rest_da": false,
"product": {
"name": "W121",
"comment": {
"en": ""
},
"pro_diff": [
{
"itemID": 2,
"description": "Intermediate"
}
],
"pro_int": [
{
"itemID": 2,
"description": "Moderate"
}
],
"pro_dur": 2674,
"nbr_exe": 6,
"target_mus": [
{
"itemID": 9,
"description": "Lats"
},
{
"itemID": 10,
"description": "Lower Back"
},
{
"itemID": 11,
"description": "Middle Back"
}
],
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
// group items by plan._id
"items": [
{
"itemid": 47,
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"target_mus": [
{
"itemID": 10,
"description": "Lower Back"
}
],
"nbr_ref": 4,
"int_rec": "06~10",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 520,
"_id": "63caa1568d47745ae5589b25",
"status": 0,
"pct_complete": 0,
"set": []
},
{
"itemid": 495,
"target_are": [
{
"itemID": 3,
"description": "Back"
}
],
"target_mus": [
{
"itemID": 11,
"description": "Middle Back"
}
],
"nbr_ref": 3,
"int_rec": "10~12",
"type_rec": [
{
"itemID": 14,
"description": "Straight Set"
}
],
"tempo": "1-1-1-1",
"rest_time": 90,
"note": "",
"order": null,
"pro_dur": 414,
"_id": "63caa1568d47745ae5589b26",
"status": 0,
"pct_complete": 0,
"set": []
}
],
"isCustomName": false,
"status": 0,
"pct_complete": 0
},
"_id": "63ca9b8e8d47745ae558994b"
}
],
"_id": "63c7fec2fe9afea23afdbcf0"
},
"title": "Short Title text here",
"itemID": "bodyfyme882212-1674051266.214",
"__v": 32
}
Any help would be greatly appreciated

Vega custom tooltip data visualisation

Could anyone help be to develop a tooltip at line chart that looks like this?
Here is my spec at Vega Lite Editor.
Tooltips work on key:value pairs. If you amend your input data to an object of key value pairs and create a flatten transform, you can achieve your desired behaviour. I have changed all the tooltips below to be identical for speed but you should see the pattern.
{
"description": "Total Count line chart.",
"width": 1200,
"height": 450,
"padding": 5,
"signals": [{"name": "interpolate", "value": "linear"}],
"legends": [
{
"fill": "color",
"orient": "bottom",
"direction": "horizontal",
"symbolType": "square"
}
],
"data": [
{
"name": "table",
"values": [
{
"x": 0,
"y": 30,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 1,
"y": 20,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 2,
"y": 90,
"c": "Passenger Vessel",
"tooltip": [
{
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 3,
"y": 60,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 4,
"y": 50,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 5,
"y": 40,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 6,
"y": 10,
"c": "Passenger Vessel",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 0,
"y": 50,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 1,
"y": 10,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 2,
"y": 50,
"c": "Pleasure Craft",
"tooltip": [
{
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 3,
"y": 40,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 4,
"y": 110,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 5,
"y": 40,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{
"x": 6,
"y": 20,
"c": "Pleasure Craft",
"tooltip": [
{
"title": "My Title",
"Tall Ship": 0,
"Sailing Yacht": 10,
"Super Yacht": 20,
"Motor Yacht": 10,
"Rib": 0
}
]
},
{"x": 0, "y": 50, "c": "Unknown", "tooltip": [{}]},
{"x": 1, "y": 60, "c": "Unknown", "tooltip": [{}]},
{"x": 2, "y": 90, "c": "Unknown", "tooltip": [{}]},
{"x": 3, "y": 40, "c": "Unknown", "tooltip": [{}]},
{"x": 4, "y": 50, "c": "Unknown", "tooltip": [{}]},
{"x": 5, "y": 20, "c": "Unknown", "tooltip": [{}]},
{"x": 6, "y": 40, "c": "Unknown", "tooltip": [{}]}
],
"transform": [{"type": "flatten", "fields": ["tooltip"]}]
}
],
"scales": [
{
"name": "x",
"type": "point",
"range": "width",
"domain": {"data": "table", "field": "x"}
},
{
"name": "y",
"type": "linear",
"range": "height",
"nice": true,
"zero": true,
"domain": {"data": "table", "field": "y"}
},
{
"name": "color",
"type": "ordinal",
"range": ["#BA20CE", "#60cf85", "#cd2c4f"],
"domain": {"data": "table", "field": "c"}
}
],
"axes": [
{"orient": "bottom", "scale": "x"},
{"orient": "left", "scale": "y"}
],
"config": {
"style": {
"guide-label": {"fontSize": 14, "fill": "#cccccc", "fontWeight": 800}
},
"axis": {"grid": true, "gridColor": "#333333"}
},
"marks": [
{
"type": "group",
"from": {"facet": {"name": "series", "data": "table", "groupby": "c"}},
"marks": [
{
"type": "line",
"from": {"data": "series"},
"encode": {
"enter": {
"x": {"scale": "x", "field": "x"},
"y": {"scale": "y", "field": "y"},
"stroke": {"scale": "color", "field": "c"},
"strokeWidth": {"value": 2}
},
"update": {
"interpolate": {"signal": "interpolate"},
"strokeOpacity": {"value": 1}
},
"hover": {"strokeOpacity": {"value": 0.5}}
}
},
{
"type": "symbol",
"from": {"data": "series"},
"encode": {
"update": {
"x": {"scale": "x", "field": "x"},
"y": {"scale": "y", "field": "y"},
"fillOpacity": {"value": 0}
},
"hover": {
"fillOpacity": {"value": 1},
"fill": {"scale": "color", "field": "c"},
"cursor": {"value": "pointer"},
"tooltip": {"signal": "datum['tooltip'] "}
}
}
}
]
}
]
}

Flutter Http response body from String to List of Object

Hi I am currently trying to fetch some data from an API, for later casting it to my Object Class.
The json answer i receive is instead of a list, directly a String.
{
"00-01": {
"date": "24-08-2022",
"hour": "00-01",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 617.5,
"units": "€/Mwh"
},
"01-02": {
"date": "24-08-2022",
"hour": "01-02",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 640.05,
"units": "€/Mwh"
},
"02-03": {
"date": "24-08-2022",
"hour": "02-03",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 670.26,
"units": "€/Mwh"
},
"03-04": {
"date": "24-08-2022",
"hour": "03-04",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 683.64,
"units": "€/Mwh"
},
"04-05": {
"date": "24-08-2022",
"hour": "04-05",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 692.88,
"units": "€/Mwh"
},
"05-06": {
"date": "24-08-2022",
"hour": "05-06",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 681.87,
"units": "€/Mwh"
},
"06-07": {
"date": "24-08-2022",
"hour": "06-07",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 624.35,
"units": "€/Mwh"
},
"07-08": {
"date": "24-08-2022",
"hour": "07-08",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 624.82,
"units": "€/Mwh"
},
"08-09": {
"date": "24-08-2022",
"hour": "08-09",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 623.24,
"units": "€/Mwh"
},
"09-10": {
"date": "24-08-2022",
"hour": "09-10",
"is-cheap": false,
"is-under-avg": true,
"market": "PVPC",
"price": 558.55,
"units": "€/Mwh"
},
"10-11": {
"date": "24-08-2022",
"hour": "10-11",
"is-cheap": false,
"is-under-avg": true,
"market": "PVPC",
"price": 511.3,
"units": "€/Mwh"
},
"11-12": {
"date": "24-08-2022",
"hour": "11-12",
"is-cheap": false,
"is-under-avg": true,
"market": "PVPC",
"price": 493.36,
"units": "€/Mwh"
},
"12-13": {
"date": "24-08-2022",
"hour": "12-13",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 484.42,
"units": "€/Mwh"
},
"13-14": {
"date": "24-08-2022",
"hour": "13-14",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 487.58,
"units": "€/Mwh"
},
"14-15": {
"date": "24-08-2022",
"hour": "14-15",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 426.72,
"units": "€/Mwh"
},
"15-16": {
"date": "24-08-2022",
"hour": "15-16",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 418.28,
"units": "€/Mwh"
},
"16-17": {
"date": "24-08-2022",
"hour": "16-17",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 422.18,
"units": "€/Mwh"
},
"17-18": {
"date": "24-08-2022",
"hour": "17-18",
"is-cheap": true,
"is-under-avg": true,
"market": "PVPC",
"price": 430.63,
"units": "€/Mwh"
},
"18-19": {
"date": "24-08-2022",
"hour": "18-19",
"is-cheap": false,
"is-under-avg": true,
"market": "PVPC",
"price": 495.26,
"units": "€/Mwh"
},
"19-20": {
"date": "24-08-2022",
"hour": "19-20",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 579.65,
"units": "€/Mwh"
},
"20-21": {
"date": "24-08-2022",
"hour": "20-21",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 614.08,
"units": "€/Mwh"
},
"21-22": {
"date": "24-08-2022",
"hour": "21-22",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 625.97,
"units": "€/Mwh"
},
"22-23": {
"date": "24-08-2022",
"hour": "22-23",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 582.99,
"units": "€/Mwh"
},
"23-24": {
"date": "24-08-2022",
"hour": "23-24",
"is-cheap": false,
"is-under-avg": false,
"market": "PVPC",
"price": 617.25,
"units": "€/Mwh"
}
}
I would like to cast that result into a LightHours, where every one would be a class Hour inside.
My main ideas was to get a List<LightHours> = {Hours,...}
Also I have tried to do the following: LightPrice lightPrice = LightPrice.fromJson(jsonDecode(response.body)); but it only gets me every field as null.
But using the json to Dart converter it doesn't allow me.
How could i convert that response into both objects classes?
Something like this maybe works:
List<LightPrice> list = (jsonDecode(response.body) as Map<String,
Map<String, dynamic>>).values.map<LightPrice>((value) =>
LightPrice.fromJson(value)).toList();
//your json string
String jsonString = json.encode(data);
//convert json string to list
List<String> newData = List<String>.from(json.decode(jsonString));
this will help to convert

Source Providers - List Branches - What is the providerName?

Source Providers - List Branches:
https://learn.microsoft.com/en-us/rest/api/azure/devops/build/source%20providers/list%20branches?view=azure-devops-rest-5.0
"GET https://dev.azure.com/{organization}/{project}/_apis/sourceProviders/{providerName}/branches?api-version=5.0-preview.1"
Can anyone tell me what the "providerName" string is for?
It's for the name of the source provider. If you're using TFVC or Azure Devops-native Git, you don't need to use this API -- there are TFVC and Git specific APIs.
If you're using an external Git provider such as GitHub or BitBucket, this is the right place to be. You need to tell the API which external provider you're trying to query.
This is why there is a page listed directly above the "List Branches" entry for a "List" API -- it lists the available source providers for your account.
GET https://dev.azure.com/{organization}/{project}/_apis/sourceproviders?api-version=5.0-preview.1
Calling that API should return something like:
{
"count": 7,
"value": [
{
"name": "GitHubEnterprise",
"supportedTriggers": [
{
"type": "continuousIntegration",
"notificationType": "webhook",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "supported",
"batchChanges": "supported",
"buildForks": "unsupported"
}
},
{
"type": "pullRequest",
"notificationType": "webhook",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "supported",
"batchChanges": "unsupported",
"buildForks": "supported"
}
},
{
"type": "schedule",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "unsupported",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
}
],
"supportedCapabilities": {
"createLabel": true,
"discoverExistingYamlDefinitions": false,
"queryBranches": true,
"queryFileContents": true,
"queryPathContents": true,
"queryPullRequest": false,
"queryRelatedWorkItems": false,
"queryRepositories": true,
"queryTopRepositories": false,
"queryWebhooks": true,
"sourceLinks": true,
"yamlDefinition": true
}
},
{
"name": "Svn",
"supportedTriggers": [
{
"type": "continuousIntegration",
"notificationType": "polling",
"defaultPollingInterval": 180,
"supportedCapabilities": {
"branchFilters": "unsupported",
"pathFilters": "required",
"batchChanges": "supported",
"buildForks": "unsupported"
}
},
{
"type": "schedule",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "unsupported",
"pathFilters": "unsupported",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
}
],
"supportedCapabilities": {
"createLabel": false,
"discoverExistingYamlDefinitions": false,
"queryBranches": false,
"queryFileContents": false,
"queryPathContents": false,
"queryPullRequest": false,
"queryRelatedWorkItems": false,
"queryRepositories": false,
"queryTopRepositories": false,
"queryWebhooks": false,
"sourceLinks": false,
"yamlDefinition": false
}
},
{
"name": "GitHub",
"supportedTriggers": [
{
"type": "continuousIntegration",
"notificationType": "webhook",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "supported",
"batchChanges": "supported",
"buildForks": "unsupported"
}
},
{
"type": "pullRequest",
"notificationType": "webhook",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "supported",
"batchChanges": "unsupported",
"buildForks": "supported"
}
},
{
"type": "schedule",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "unsupported",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
}
],
"supportedCapabilities": {
"createLabel": true,
"discoverExistingYamlDefinitions": false,
"queryBranches": true,
"queryFileContents": true,
"queryPathContents": true,
"queryPullRequest": true,
"queryRelatedWorkItems": true,
"queryRepositories": true,
"queryTopRepositories": true,
"queryWebhooks": true,
"sourceLinks": true,
"yamlDefinition": true
}
},
{
"name": "Bitbucket",
"supportedTriggers": [
{
"type": "continuousIntegration",
"notificationType": "webhook",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "unsupported",
"batchChanges": "supported",
"buildForks": "unsupported"
}
},
{
"type": "pullRequest",
"notificationType": "webhook",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "unsupported",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
},
{
"type": "schedule",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "unsupported",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
}
],
"supportedCapabilities": {
"createLabel": false,
"discoverExistingYamlDefinitions": false,
"queryBranches": true,
"queryFileContents": false,
"queryPathContents": false,
"queryRelatedWorkItems": false,
"queryPullRequest": false,
"queryRepositories": true,
"queryTopRepositories": false,
"queryWebhooks": false,
"sourceLinks": true,
"yamlDefinition": false
}
},
{
"name": "Git",
"supportedTriggers": [
{
"type": "continuousIntegration",
"notificationType": "polling",
"defaultPollingInterval": 180,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "unsupported",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
},
{
"type": "schedule",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "unsupported",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
}
],
"supportedCapabilities": {
"createLabel": false,
"discoverExistingYamlDefinitions": false,
"queryBranches": false,
"queryFileContents": false,
"queryPathContents": false,
"queryPullRequest": false,
"queryRelatedWorkItems": false,
"queryRepositories": false,
"queryTopRepositories": false,
"queryWebhooks": false,
"sourceLinks": false,
"yamlDefinition": false
}
},
{
"name": "TfsGit",
"supportedTriggers": [
{
"type": "continuousIntegration",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "supported",
"batchChanges": "supported",
"buildForks": "unsupported"
}
},
{
"type": "schedule",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "required",
"pathFilters": "supported",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
}
],
"supportedCapabilities": {
"createLabel": true,
"discoverExistingYamlDefinitions": false,
"queryBranches": false,
"queryFileContents": true,
"queryPathContents": true,
"queryPullRequest": true,
"queryRelatedWorkItems": true,
"queryRepositories": false,
"queryTopRepositories": false,
"queryWebhooks": false,
"sourceLinks": true,
"yamlDefinition": true
}
},
{
"name": "TfsVersionControl",
"supportedTriggers": [
{
"type": "continuousIntegration",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "unsupported",
"pathFilters": "required",
"batchChanges": "supported",
"buildForks": "unsupported"
}
},
{
"type": "gatedCheckIn",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "unsupported",
"pathFilters": "required",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
},
{
"type": "schedule",
"notificationType": "none",
"defaultPollingInterval": 0,
"supportedCapabilities": {
"branchFilters": "unsupported",
"pathFilters": "unsupported",
"batchChanges": "unsupported",
"buildForks": "unsupported"
}
}
],
"supportedCapabilities": {
"createLabel": true,
"discoverExistingYamlDefinitions": false,
"queryBranches": false,
"queryFileContents": true,
"queryPathContents": true,
"queryPullRequest": false,
"queryRelatedWorkItems": true,
"queryRepositories": false,
"queryTopRepositories": false,
"queryWebhooks": false,
"sourceLinks": false,
"yamlDefinition": false
}
}
]
}

How to calculate YTD and MTD in mongodb?

How to calculate Month-To-Date(MTD) and Year-To-Date(YTD) in mongodb in a single query? sample data below, in this data requestedOn is a date field, I want to calculate MTD & YTD, on the assumption of financial year on "1st Jan of the year"(For example financial year for year 2016 is "01-Jan-2016" :
{
"_id": {
"$oid": "5808578b33fa6f161c9747f8"
},
"_class": "exceltest.TestBean",
"requestedOn": "2000-03-01",
"bookName": "Test6",
"revenue": 10.0,
"unitsSold": 1,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
},
{
"categoryCode": "Cooking/Beverages/Bartending"
},
{
"categoryCode": "Food Receipe/Taste"
}
]
}{
"_id": {
"$oid": "5808578b33fa6f161c9747f9"
},
"_class": "exceltest.TestBean",
"requestedOn": "2000-03-01",
"bookName": "Test1",
"revenue": 11.0,
"unitsSold": 2,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
},
{
"categoryCode": "Cooking/Beverages/Bartending"
},
{
"categoryCode": "Food Receipe/Taste"
}
]
}{
"_id": {
"$oid": "5808578b33fa6f161c9747fa"
},
"_class": "exceltest.TestBean",
"requestedOn": "2000-06-01",
"bookName": "Test2",
"revenue": 12.0,
"unitsSold": 3,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
},
{
"categoryCode": "Cooking/Beverages/Bartending"
},
{
"categoryCode": "Food Receipe/Taste"
}
]
}{
"_id": {
"$oid": "5808578b33fa6f161c9747fb"
},
"_class": "exceltest.TestBean",
"requestedOn": "2000-07-01",
"bookName": "Test3",
"revenue": 13.0,
"unitsSold": 4,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
},
{
"categoryCode": "Cooking/Beverages/Bartending"
},
{
"categoryCode": "Food Receipe/Taste"
}
]
}{
"_id": {
"$oid": "5808578b33fa6f161c9747fc"
},
"_class": "exceltest.TestBean",
"requestedOn": "2009-09-01",
"bookName": "Test4",
"revenue": 14.0,
"unitsSold": 5,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
},
{
"categoryCode": "Cooking/Beverages/Bartending"
},
{
"categoryCode": "Food Receipe/Taste"
}
]
}{
"_id": {
"$oid": "5808578b33fa6f161c9747fd"
},
"_class": "exceltest.TestBean",
"requestedOn": "2009-06-01",
"bookName": "Test5",
"revenue": 15.0,
"unitsSold": 6,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
},
{
"categoryCode": "Cooking/Beverages/Bartending"
},
{
"categoryCode": "Food Receipe/Taste"
}
]
}{
"_id": {
"$oid": "5808578b33fa6f161c9747fe"
},
"_class": "exceltest.TestBean",
"requestedOn": "2004-06-01",
"bookName": "Test10",
"revenue": 16.0,
"unitsSold": 7,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
},
{
"categoryCode": "Cooking/Beverages/Bartending"
},
{
"categoryCode": "Food Receipe/Taste"
}
]
}{
"_id": {
"$oid": "5808578b33fa6f161c9747ff"
},
"_class": "exceltest.TestBean",
"requestedOn": "2000-01-01",
"bookName": "Test11",
"revenue": 100.0,
"unitsSold": 100,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
},
{
"categoryCode": "Cooking/Beverages/Bartending"
},
{
"categoryCode": "Food Receipe/Taste"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e462"
},
"_class": "exceltest.TestBean",
"requestedOn": "2000-02-01",
"bookName": "Test1",
"revenue": 20.0,
"unitsSold": 10,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e463"
},
"_class": "exceltest.TestBean",
"requestedOn": "2001-02-01",
"bookName": "Test2",
"revenue": 19.0,
"unitsSold": 9,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e464"
},
"_class": "exceltest.TestBean",
"requestedOn": "2001-02-01",
"bookName": "Test3",
"revenue": 18.0,
"unitsSold": 8,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e465"
},
"_class": "exceltest.TestBean",
"requestedOn": "2007-06-01",
"bookName": "Test4",
"revenue": 17.0,
"unitsSold": 7,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e466"
},
"_class": "exceltest.TestBean",
"requestedOn": "2005-06-01",
"bookName": "Test5",
"revenue": 16.0,
"unitsSold": 6,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e467"
},
"_class": "exceltest.TestBean",
"requestedOn": "2004-06-01",
"bookName": "Test1",
"revenue": 15.0,
"unitsSold": 5,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e468"
},
"_class": "exceltest.TestBean",
"requestedOn": "2002-06-01",
"bookName": "Test2",
"revenue": 14.0,
"unitsSold": 4,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e469"
},
"_class": "exceltest.TestBean",
"requestedOn": "2001-06-01",
"bookName": "Test3",
"revenue": 13.0,
"unitsSold": 3,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e46a"
},
"_class": "exceltest.TestBean",
"requestedOn": "2000-06-01",
"bookName": "Test4",
"revenue": 12.0,
"unitsSold": 2,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}{
"_id": {
"$oid": "580857b833fa6f0c3499e46b"
},
"_class": "exceltest.TestBean",
"requestedOn": "2008-06-01",
"bookName": "Test5",
"revenue": 11.0,
"unitsSold": 1,
"bookCategory": [
{
"categoryCode": "Cooking/"
},
{
"categoryCode": "Cooking/Beverages"
},
{
"categoryCode": "Food Receipe/"
},
{
"categoryCode": "Food Receipe/Bartending"
}
]
}
Regards
Kris
It is a good practice to keep dates in MongoDB in its native dateformat ISODate().
You can use date formats like $year,$month,$day,$hour etc.
These can be used for grouping , in your case:
db.collectionName.aggregate([
{$group:{_id:{'Date':{$year:'$requestedOn'}},total:{$sum:'$FieldName'}}}
])
to convert string to ISODate , answers can be found at
- [http://stackoverflow.com/questions/15473772/how-to-convert-from-string-to-date-data-type?noredirect=1&lq=1][2]
- [http://stackoverflow.com/questions/15473772/how-to-convert-from-string-to-date-data-type?noredirect=1&lq=1][2]