sql >> データベース >  >> NoSQL >> MongoDB

mongoDBでユニオンを実行する

    これには、aggregateを使用できるいくつかのアプローチがあります。

    の方法
    db.collection.aggregate([
        // Assign an array of constants to each document
        { "$project": {
            "linkedIn": 1,
            "twitter": 1,
            "source": { "$cond": [1, ["linkedIn", "twitter"],0 ] }
        }},
    
        // Unwind the array
        { "$unwind": "$source" },
    
        // Conditionally push the fields based on the matching constant
        { "$group": { 
            "_id": "$_id",
            "data": { "$push": {
                "$cond": [
                    { "$eq": [ "$source", "linkedIn" ] },
                    { "source": "$source", "people": "$linkedIn.people" },
                    { "source": "$source", "people": "$twitter.people" }
                ]
            }}
        }},
    
        // Unwind that array
        { "$unwind": "$data" },
    
        // Unwind the underlying people array
        { "$unwind": "$data.people" },
    
        // Project the required fields
        { "$project": {
            "_id": 0,
            "name": "$data.people.name",
            "source": "$data.source"
        }}
    ])
    

    または、MongoDB 2.6の一部の演算子を使用した別のアプローチ:

    db.people.aggregate([
        // Unwind the "linkedIn" people
        { "$unwind": "$linkedIn.people" },
    
        // Tag their source and re-group the array
        { "$group": {
            "_id": "$_id",
            "linkedIn": { "$push": {
                "name": "$linkedIn.people.name",
                "source": { "$literal": "linkedIn" }
            }},
            "twitter": { "$first": "$twitter" }
        }},
    
        // Unwind the "twitter" people
        { "$unwind": "$twitter.people" },
    
        // Tag their source and re-group the array
        { "$group": {
            "_id": "$_id",
            "linkedIn": { "$first": "$linkedIn" },
            "twitter": { "$push": {
                "name":  "$twitter.people.name",
                "source": { "$literal": "twitter" }
            }}
        }},
    
        // Merge the sets with "$setUnion"
        { "$project": {
            "data": { "$setUnion": [ "$twitter", "$linkedIn" ] }
        }},
    
        // Unwind the union array
        { "$unwind": "$data" },
    
        // Project the fields
        { "$project": {
            "_id": 0,
            "name": "$data.name",
            "source": "$data.source"
        }}
    ])
    

    そしてもちろん、ソースが何であるかを単に気にしない場合:

    db.collection.aggregate([
        // Union the two arrays
        { "$project": {
            "data": { "$setUnion": [
                "$linkedIn.people",
                "$twitter.people"
            ]}
        }},
    
        // Unwind the union array
        { "$unwind": "$data" },
    
        // Project the fields
        { "$project": {
            "_id": 0,
            "name": "$data.name",
        }}
    
    ])
    


    1. マングースの別のスキーマを参照する

    2. 行を取得せずにMongoTemplate.aggregateを実行します

    3. MongoEngineとPyMongoを一緒に使用する

    4. サーバーの解析-ファイルが見つかりません