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

Mongoの一部のフィールドを文字列から配列に変換する

    $ typeは使用できません 配列内の要素のタイプは「文字列」であり、ドキュメントに記載されているように、ここでドキュメントをフィルタリングする演算子:

    しかし幸いなことに、MongoDBは $ examplesも提供します ここで数値配列インデックスとともに使用できる演算子。

    では、これらのドキュメントをどのように更新できますか?

    ええと、MongoDBバージョン<=3.2から、私たちが持っている唯一のオプションは mapReduce() ただし、最初に、MongoDBの次のリリースで他の代替案を見てみましょう。

    MongoDB 3.4以降、 $ project ドキュメントと$splitを使用します 文字列を部分文字列の配列に分割する演算子。

    文字列である「タグ」のみを分割するには、論理的なが必要であることに注意してください。 $ cond 文字列である値のみを分割するための処理。ここでの条件は、 $ eqです。 trueと評価されます $ typeの場合 フィールドのは"string"と同じです 。ちなみに$type これは3.4の新機能です。

    最後に、 $ out> パイプラインステージ演算子。 ただし、 $ projectに他のフィールドを含めることを明示的に指定する必要があります ステージ

    db.collection.aggregate(
         [
            { "$project": { 
                "tags": { 
                    "$cond": [ 
                        { "$eq": [ 
                            { "$type": "$tags" }, 
                            "string"
                        ]}, 
                        { "$split": [ "$tags", " " ] }, 
                        "$tags" 
                    ] 
                } 
            }},
            { "$out": "collection" }
        ]
    )
    

    mapReduceを使用 、配列を使用する必要があります。 protocol.split() map関数で部分文字列の配列を出力します 。また、「クエリ」オプションを使用してドキュメントをフィルタリングする必要があります。そこから、「results」配列と $ setを繰り返す必要があります。 bulkWrite() 3.2で新しく追加されたメソッド、または現在廃止されている Bulk() こちら に示すように2.6または3.0を使用している場合

    db.collection.mapReduce(
        function() { emit(this._id, this.tags.split(" ")); }, 
        function(key, value) {}, 
        { 
            "out": { "inline": 1 }, 
            "query": { 
                "tags.0": { "$exists": false }, 
                "tags": { "$type": 2 }
            }
        }
    )['results']
    



    1. spring-dataを介してMongoDBの大規模なコレクションを反復処理します

    2. NodeMongoRESTサービス投稿

    3. MongoDBでドキュメントを並べ替える3つの方法

    4. MongoDB / Express-connect()を介して接続した後にデータベースを切り替える方法