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

マングース選択サブドキュメントフィールド

    これは、MongoDBが配列要素を使用した基本的なプロジェクションを処理する方法です。あなたはこのようなことをすることができますが:

    Model.findOne({}, { "comments.upvotes": 1 },function(err,doc) {
    
    })
    

    そして、それは、条件に一致するすべてのドキュメントとすべての配列要素のコメント配列のサブドキュメント内から「賛成」フィールドを返すだけです。もちろん、 position $ オペレーター。これは基本的に「理論」に由来します その一般的に 実際には、配列全体を返したいと考えています。したがって、これは常に機能しており、すぐに変更される可能性は低い方法です。

    必要なものを取得するには、集約フレームワーク 。これにより、ドキュメントの返送方法をより細かく制御できます。

    Model.aggregate(
        [
            // Match the document containing the array element
            { "$match": { "comments._id" : oid } },
    
            // Unwind to "de-normalize" the array content
            { "$unwind": "$comments" },
    
            // Match the specific array element
            { "$match": { "comments._id" : oid } },
    
            // Group back and just return the "upvotes" field
            { "$group": {
                "_id": "$_id",
                "comments": { "$push": { "upvotes": "$comments.upvotes" } }
            }}
        ],
        function(err,docs) {
    
    
        }
    );
    

    または、2.6以降のMongoDBの最新バージョンでは、これを行うこともできます:

    Model.aggregate(
        [
            { "$match": { "comments._id" : oid } },
            { "$project": {
                "comments": {
                    "$setDifference": [
                        { "$map": {
                            "input": "$comments",
                            "as": "el",
                            "in": {
                                "$cond": [
                                    { "$eq": [ "$$el._id", oid ] },
                                    { "upvotes": "$$el.upvotes" },
                                    false
                                ]
                            }
                        }},
                        [false]
                    ]
                }}
            }}
        ],
        function(err,docs) {
    
        }
    )
    

    そして、それは $mapを使用します および $setDifference 演算子は、最初に $unwind ステージ。

    したがって、ドキュメントが返される方法をより細かく制御したい場合は、埋め込みドキュメントを操作するときに集約フレームワークがそれを行う方法です。




    1. MongoDBの単一フィールドの配列内の文字列値を連結します

    2. MongodbはUbuntu15.04で起動できません

    3. docker-compose:コンテナ間のredis接続が拒否されました

    4. パイプされたファイルストリームの出力は何ですか?