MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

स्प्रिंग मोंगोडीबी एग्रीगेशन पर डीबीआरएफ कैसे प्रोजेक्ट करें?

<मजबूत>1. MongoDB संस्करण 3.4 के साथ

ये निम्नलिखित संग्रह हैं जिन्हें मैंने आपके उपयोग के मामले को पुन:पेश करने के लिए बनाया है:

अलर्ट संग्रह

{ 
    "_id" : ObjectId("59e6ff3d9ef9d46a91112890"), 
    "_class" : "es.bisite.usal.bulltect.persistence.entity.AlertEntity", 
    "level" : "INFO", 
    "title" : "Alerta de Prueba", 
    "payload" : "Alerta de Prueba", 
    "create_at" : ISODate("2017-10-18T07:13:45.091+0000"), 
    "delivery_mode" : "PUSH_NOTIFICATION", 
    "delivered" : false, 
    "parent" : DBRef("parents", ObjectId("59e6ff369ef9d46a91112878")), 
    "son" : DBRef("children", ObjectId("59e72ff0572ae72d8c063666"))
}
{ 
    "_id" : ObjectId("59e6ff6d9ef9d46a91112892"), 
    "_class" : "es.bisite.usal.bulltect.persistence.entity.AlertEntity", 
    "level" : "WARNING", 
    "title" : "Token de acceso inv�lido.", 
    "payload" : "El token de acceso YOUTUBE no es valido", 
    "create_at" : ISODate("2017-10-18T07:14:53.449+0000"), 
    "delivery_mode" : "PUSH_NOTIFICATION", 
    "delivered" : false, 
    "parent" : DBRef("parents", ObjectId("59e6ff369ef9d46a91112878")), 
    "son" : DBRef("children", ObjectId("59e72ff0572ae72d8c063666"))
}
{ 
    "_id" : ObjectId("59e6ff6d9ef9d46a91112893"), 
    "_class" : "es.bisite.usal.bulltect.persistence.entity.AlertEntity", 
    "level" : "WARNING", 
    "title" : "Token de acceso inv�lido.", 
    "payload" : "El token de acceso INSTAGRAM no es v�lido", 
    "create_at" : ISODate("2017-10-18T07:14:53.468+0000"), 
    "delivery_mode" : "PUSH_NOTIFICATION", 
    "delivered" : false, 
    "parent" : DBRef("parents", ObjectId("59e6ff369ef9d46a91112878")), 
    "son" : DBRef("children", ObjectId("59e72ffb572ae72d8c063669"))
}

नोटिस मैंने अपने द्वारा बनाए गए बच्चों के संग्रह से मेल खाने के लिए बेटों के संदर्भ के OBjectIds को बदल दिया है।

बच्चों का संग्रह

{ 
    "_id" : ObjectId("59e72ff0572ae72d8c063666"), 
    "name" : "Bob"
}
{ 
    "_id" : ObjectId("59e72ffb572ae72d8c063669"), 
    "name" : "Tim"
}

चूंकि आप किसी संदर्भ का उपयोग कर रहे हैं, इसलिए आप अन्य संग्रह से किसी फ़ील्ड तक नहीं पहुंच सकते हैं। इसलिए मुझे लगता है कि आप कुछ एकत्रीकरण चरणों को याद कर रहे हैं।

मैंने निम्नलिखित किया:

db.getCollection('alerts').aggregate(
{
            $unwind:"$son"
        },
        {
            $group:
            {
                _id:{
                    son: "$son",
                    level: "$level"
                },
                count: { $sum: 1 }
            }
        },
        {
            $group:
                {
                    _id:{ 
                        son: "$_id.son"
                    },
                    alerts: { $addToSet: {
                        level: "$_id.level",
                        count: "$count"
                    }}

                }
         },
        { $addFields: { sonsArray: { $objectToArray: "$_id.son" } } },
        { $match: { "sonsArray.k": "$id"}  },
        { $lookup: { from: "children", localField: "sonsArray.v", foreignField: "_id", as: "name" } }
)

और जेसन के रूप में निम्नलिखित परिणाम प्राप्त हुए:

{ 
    "_id" : {
        "son" : DBRef("children", ObjectId("59e72ffb572ae72d8c063669"))
    }, 
    "alerts" : [
        {
            "level" : "WARNING", 
            "count" : NumberInt(1)
        }
    ], 
    "sonsArray" : [
        {
            "k" : "$ref", 
            "v" : "children"
        }, 
        {
            "k" : "$id", 
            "v" : ObjectId("59e72ffb572ae72d8c063669")
        }
    ], 
    "name" : [
        {
            "_id" : ObjectId("59e72ffb572ae72d8c063669"), 
            "name" : "Tim"
        }
    ]
}
{ 
    "_id" : {
        "son" : DBRef("children", ObjectId("59e72ff0572ae72d8c063666"))
    }, 
    "alerts" : [
        {
            "level" : "INFO", 
            "count" : NumberInt(1)
        }, 
        {
            "level" : "WARNING", 
            "count" : NumberInt(1)
        }
    ], 
    "sonsArray" : [
        {
            "k" : "$ref", 
            "v" : "children"
        }, 
        {
            "k" : "$id", 
            "v" : ObjectId("59e72ff0572ae72d8c063666")
        }
    ], 
    "name" : [
        {
            "_id" : ObjectId("59e72ff0572ae72d8c063666"), 
            "name" : "Bob"
        }
    ]
}

यदि आप उन क्षेत्रों से छुटकारा पाना चाहते हैं जहां अतिरिक्त रूप से sonArray आदि बनाए गए हैं, तो आप एक $project जोड़ सकते हैं पाइपलाइन से clean आपका परिणाम।

<मजबूत>2. यदि आपके पास मोंगोडब के पुराने संस्करण हैं और आप अपनी डेटा संरचना बदल सकते हैं।

अगर इस तरह के संदर्भ का उपयोग करने के बजाय:

"son" : DBRef("children", ObjectId("59e72ffb572ae72d8c063669"))

आप बेटे/एस के ऑब्जेक्ट आईडी को इस तरह एक सरणी के रूप में जोड़ सकते हैं:

"sonId" : [
        ObjectId("59e72ff0572ae72d8c063666")
    ]

तो आप अपना एकत्रीकरण इस प्रकार कर सकते हैं:

db.getCollection('alerts').aggregate(
{
            $unwind:"$sonId"
        },
        {
            $group:
            {
                _id:{
                    sonId: "$sonId",
                    level: "$level"
                },
                count: { $sum: 1 }
            }
        },
        {
            $group:
                {
                    _id:{ 
                        sonId: "$_id.sonId"
                    },
                    alerts: { $addToSet: {
                        level: "$_id.level",
                        count: "$count"
                    }}

                }
         },
        { $lookup: { from: "children", localField: "_id.sonId", foreignField: "_id", as: "son" } }
)

क्या वह ऐसी चीज है जिसकी आप तलाश कर रहे हैं?




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. जांचें कि क्या फ़ील्ड किसी ऐरे के उप-दस्तावेज़ में मौजूद है

  2. क्लस्टर नियंत्रण के साथ डेटाबेस उपयोगकर्ता प्रबंधन

  3. MongoDB PHP सरणी के साथ $in का उपयोग कर रहा है

  4. async nodejs क्वेरी और प्रोसेसिंग परिणाम

  5. MongoDB में .NET ड्राइवर 2.0 के साथ बिल्डिंग इंडेक्स