Il n'y a pas de $move
dans MongoDB
. Cela étant dit, la solution la plus simple est une approche en 2 phases :
La partie importante ici, pour s'assurer que tout est idempotent, est d'inclure le document de tableau d'origine dans la requête pour la mise à jour.
Soit un document de la forme suivante :
{
_id: "foo",
arrayField: [
{
a: 1,
b: 1
},
{
a: 2,
b: 1
}
]
}
Disons que vous voulez déplacer { a: 1, b: 1 }
à un champ différent, peut-être appelé someOtherArrayField
, vous voudriez faire quelque chose comme.
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 } })
La raison pour laquelle nous utilisons le $elemMatch
est d'être sûr que le champ que nous sommes sur le point de supprimer du tableau n'a pas changé depuis que nous avons interrogé le document pour la première fois. Lorsqu'il est couplé avec un $pull
ce n'est pas non plus strictement nécessaire, mais je suis généralement trop prudent dans ces situations. S'il n'y a pas de parallélisme dans votre application et que vous n'avez qu'une seule instance d'application, ce n'est pas strictement nécessaire.
Maintenant, lorsque nous vérifions le document résultant, nous obtenons :
db.col.findOne()
{
"_id" : "foo",
"arrayField" : [
{
"a" : 2,
"b" : 1
}
],
"someOtherArrayField" : [
{
"a" : 1,
"b" : 1
}
]
}