$ move
はありません MongoDBで
。そうは言っても、最も簡単な解決策は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
}
]
}