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

同じドキュメントMongoDB内のある配列から別の配列に要素を移動する

    $ moveはありません MongoDBで 。そうは言っても、最も簡単な解決策は2段階のアプローチです:

    1. ドキュメントをクエリする
    2. $ pull> および $ push / $ addToSet

    ここで重要なのは、すべてがべき等であることを確認するために、更新のクエリに元のアレイドキュメントを含めることです。

    次の形式のドキュメントがあるとします:

    {
        _id: "foo",
        arrayField: [
            {
                a: 1,
                b: 1
            },
            {
                a: 2,
                b: 1
            }
        ]
    }
    

    {a:1、b:1}を移動するとします。 別のフィールドに移動します。someOtherArrayFieldと呼ばれることもあります 、あなたは次のようなことをしたいと思うでしょう。

    var doc = db.col.findOne({_id: "foo"});
    var arrayDocToMove = doc.arrayField[0];
    db.col.update({_id: "foo", arrayField: { $elemMatch: arrayDocToMove} }, { $pull: { arrayField: arrayDocToMove }, $addToSet: { someOtherArrayField: arrayDocToMove } })
    

    $ elemMatchを使用する理由 配列から削除しようとしているフィールドが、最初にドキュメントを照会してから変更されていないことを確認する必要があります。 $ pullと組み合わせた場合 また、厳密に必要というわけではありませんが、私は通常、これらの状況では過度に慎重です。アプリケーションに並列処理がなく、アプリケーションインスタンスが1つしかない場合は、厳密には必要ありません。

    結果のドキュメントを確認すると、次のようになります。

    db.col.findOne()
    {
            "_id" : "foo",
            "arrayField" : [
                    {
                            "a" : 2,
                            "b" : 1
                    }
            ],
            "someOtherArrayField" : [
                    {
                            "a" : 1,
                            "b" : 1
                    }
            ]
    }
    



    1. mongoDBJavaドライバーを介したmongoStatの取得

    2. Ubuntuでレプリカセットを開始できません

    3. マングース:スキーマvsモデル?

    4. PHP経由でMongoDBに接続できません