Peut mongo upsert tableau de données?
J'ai un mongo document de ce genre.
{
"_id" : ObjectId("50b429ba0e27b508d854483e"),
"array" : [
{
"id" : "1",
"letter" : "a"
},
{
"id" : "2",
"letter" : "b"
}
],
"tester" : "tom"
}
Je veux être capable d'insérer et mettre à jour les array
avec un seul mongo commande et ne pas utiliser un conditionnel dans un find()
puis exécutez insert()
et update()
en fonction de la présence de l'objet.
La id
est l'élément que je veux être le sélecteur. Donc, si je mets à jour le tableau avec cette:
{
"id" : "2",
"letter" : "c"
}
- Je utiliser un $set
déclaration
db.soup.update({
"tester":"tom",
'array.id': '2'
}, {
$set: {
'array.$.letter': 'c'
}
})
Et si je veux insérer un nouvel objet dans le tableau
{
"id" : "3",
"letter" : "d"
}
- Je utiliser un $push
déclaration
db.soup.update({
"tester":"tom"
}, {
$push: {
'array': {
"id": "3",
"letter": "d"
}
}
})
J'ai besoin d'une sorte de upsert pour un élément de tableau.
Dois-je le faire par programmation ou puis-je le faire avec un seul mongo appel?
- Cela m'étonne que mongo n'ai toujours pas cette fonctionnalité de base que je croise plusieurs fois dans chaque projet que j'ai utilisé mongo avec :/
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas au courant de la possibilité de upsert incorporé dans un tableau comme à MongoDB 2.2, de sorte que vous aurez probablement à les traiter dans le code de votre application.
Étant donné que vous voulez traiter l'embedded tableau de tri d'une collection virtuelle, vous pouvez envisager la modélisation de la matrice comme une collecte séparée à la place.
Vous ne pouvez pas faire un upsert basée sur la valeur d'un champ à l'intérieur d'un incorporé de tableau, mais vous pouvez utiliser
$addToSet
pour insérer un document incorporé si elle n'existe pas déjà:Qui ne correspond pas exactement à vos cas d'utilisation de l'appariement par
id
de l'élément du tableau, mais peut être utile si vous connaisse la valeur actuelle.Je viens de tomber sur ce problème moi-même. Je n'ai pas pu trouver la solution, mais j'ai trouvé un deux-appel solution qui fonctionne lorsque vous avez une valeur unique dans votre tableau des éléments. Utiliser le
$pull
première commande, qui supprime des éléments d'un tableau, et ensuite$push
.Cela doit fonctionner lorsque le document n'existe pas, si le document existe, mais l'entrée dans le tableau n'existe pas, et quand elle existe.
Encore une fois, cela ne fonctionne que si vous avez quelque chose, comme le
id
de terrain dans cet exemple, qui doit être unique sur les éléments de la matrice.$exists
vérifier dans$push
de la requête, de sorte qu'elle échoue si quelque chose se passe entre les 2 appels.Vous pouvez obtenir upserts de document incorporé définit, dans certains cas, si vous pouvez restructurer vos documents à utiliser des objets au lieu des tableaux. Je viens de répondre sur ce une autre question mais de l'adapter ici pour plus de commodité.
Un exemple de document serait
À upsert un élément avec
id
3 et la valeur de "c", vous feriezUn inconvénient est que l'interrogation pour les noms de champs (à l'aide de la
$exists
opérateur de requête) nécessite la numérisation. Vous pouvez contourner ce problème en ajoutant un supplément de matrice de champ qui stocke les noms de propriété. Ce champ peut être indexé et interrogé normalement. Upserts devenir(Gardez à l'esprit
$addToSet
est O(n).) Lors de la suppression d'une propriété, vous avez à tirer du tableau en tant que bien.Hey, Vous pouvez le faire en utilisant la matrice de filtres en option.
Vous pouvez consulter ici
https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-arrayfilters.