Maison >base de données >MongoDB >Mise à jour du document MongoDB (exemple de code php)

Mise à jour du document MongoDB (exemple de code php)

齐天大圣
齐天大圣original
2020-08-24 14:39:332421parcourir

Les documents de mise à jour de MongoDB sont divisés en deux catégories :

  • remplacement de document, qui remplace complètement l'ancien document par le nouveau document

  • modificateur , Modifier certains documents

Remplacement de documents

L'utilisation du remplacement de documents est très simple, voyons la démonstration ci-dessous :

$collect->insertOne(['name' => 'lakers', 'nums'=> 16]);
$collect->replaceOne(
    ['name'=>'lakers'], 
    ['name' => 'heat', 'nums'=>3]
);

Utilisez des modificateurs pour effectuer des opérations de mise à jour plus complexes, telles que la modification, l'ajout ou la suppression de clés.

Modificateur "$set"

"$set" est utilisé pour spécifier la valeur d'un champ. Si ce champ n'existe pas, créez-le.

$collect->insertOne([
    'name' => 'james',
    'age' => 35,
]);

$collect->updateOne(['name'=>'james'],
    ['$set' => ['fruit' => 'apple']]
);
// fruit字段不存在,则会创建该字段

Si vous n'aimez pas la pomme maintenant et que vous souhaitez passer à la fraise

$collect->updateOne(['name'=>'james'],
    ['$set' => ['fruit' => 'strawberry']]
);

"$set" peut également modifier le type de clé.

# 不止喜欢草莓,还喜欢梨子、香蕉。
$collect->updateOne(['name'=>'james'],
    ['$set' =>
        ['fruit' => 
            ['strawberry', 'banana', 'pear'] 
        ]
    ]
);

"$set" peut également modifier les documents intégrés

$collect->insertOne([
    'name' => 'james',
    'age' => 35,
    'brothers' => ['name' => 'wade', 'age'=> 38]
]);

$collect->updateOne(['name'=>'james'],
    ['$set' =>
        ['brothers.name' => 'paul']
    ]
);

Modificateur "$unset"

Utiliser" Le $ le modificateur unset" peut supprimer le champ spécifié

$collect->updateOne(['name'=>'james'],
    ['$unset' =>
        ['brothers' => '']
    ]
);

le modificateur "$inc", augmenter ou diminuer la valeur

et "$set" Like le modificateur, si le champ n'existe pas, il sera automatiquement créé. Remarque : Cette valeur de champ ne peut être que des nombres.

$collect->updateOne(['name'=>'james'],
    ['$inc' =>
        ['scores' => 61]
    ]
);
## 现有积分61

Maintenant, 10 points ont été obtenus.

$collect->updateOne(['name'=>'james'],
    ['$inc' =>
        ['scores' => 10]
    ]
);
## 现有积分71

Plus tard, j'ai dépensé 50 points

$collect->updateOne(['name'=>'james'],
     ['$inc' =>['scores' => -50]
 ] ); 
 ## 现有积分21

Array Modifier

MongoDB fournit des modifications spéciales pour la méthode des tableaux.

"$push" ajoute des éléments

"$push" peut ajouter des éléments au tableau Si le tableau n'existe pas, il le fera. Créez automatiquement un tableau. Il existe maintenant un document utilisé pour enregistrer les données de l'article :

$collect->insertOne([
     '_id' => 1,      
     'title'=>'study mongodb',      
     'create_time' => '2020-08-24 12 :31' 
]); 
$push = ['$push' => ['comments' => 'comments1'] ]; 
$collect->updateOne(['_id' => 1 ], $push);

"$each" ajoute plusieurs éléments

'$push' peut être disposé en tableau at once Element, si vous souhaitez ajouter plusieurs éléments à la fois, vous devez utiliser « $each ».

$push = [    
     '$push' => 
         ['comments' => 
             ['$each' => ['comment1', 'comment2', 'comment3']]
         ] 
      ]; 
$collect->updateOne(['_id' => 1 ], $push);

"$slice" conserve n éléments

'$push' et '$slicet' sont utilisés ensemble pour conserver les n derniers éléments Data, la valeur de « $slice » ne peut être que des entiers négatifs. Par exemple, je souhaite uniquement conserver les 3 derniers commentaires :

# 目前数据如下
 > db.users.find() 
{ "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ "comment1", "comment2", "comment3", "comment4", "comment5", "comment6" ] }
$push = [
     '$push' => [ 
        'comment' => [ 
            '$each' => ['comment7', 'comment8', 'comment9'],                                '$slice' => -3 
        ],
     ], 
]; 
$collect->updateOne(['_id' => 1 ], $push);
# 现数据如下 
db.users.find() 
{ "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ "comment7", "comment8", "comment9" ] }

Le tri "$sort"

peut également être utilisé avec '$ sort' , conservez les 3 commentaires avec le plus de likes.

# 目前是集合内是空的,么有任何文档
$collect->insertOne(['_id' => 1, 'title'=>'study mongodb', 'create_time' => '2020-08-24 12:31']);
$push = [
    '$push' => [
        'comment' => [
            '$each' => [
                ['comment' => 'php', 'like' => 100], 
                ['comment' => 'mysql', 'like' => 10], 
                ['comment' => 'linux', 'like' => 200], 
                ['comment' => 'java', 'like' => 1000], 
                ['comment' => 'nginx', 'like' => 300], 
                ['comment' => 'composer', 'like' => 500], 
            ],
            '$slice' => -3,
            '$sort' => ['like' => 1]
        ],
    ],
];

Regardons à quoi ressemblent les données de la collection :

> db.users.find()
{ "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ { "comment" : "nginx", "like" : 300 }, { "comment" : "composer", "like" : 500 }, { "comment" : "java", "like" : 1000 } ] }

Notez que vous ne pouvez pas simplement utiliser "$slice" ou "$sort" avec "$push ", et vous devez utiliser "$each".

"$addToSet" évite d'insérer des données en double

Lorsque vous utilisez "$addToSet" pour ajouter de nouveaux éléments de tableau, vous pouvez éviter ajout de données en double, telles que

$collect->insertOne([
    '_id' => 1,
    'name' => 'gwx', 
    'age' => 30, 
    'fruits' => ['apple', 'pear']
]);

$update = [
    '$addToSet' => [
        'fruits' => 'apple'
    ]
];

La modification ci-dessus ne réussira pas car Apple existe déjà. '$addToSet' peut également être utilisé avec "$each" pour insérer plusieurs éléments de tableau.

$update = [
    '$addToSet' => [
        'fruits' => [
            '$each' => ['apple', 'banana', 'orange']
        ]
    ]
];
$collect->updateOne(['_id' => 1], $update);

Supprimer l'élément

Vous pouvez supprimer l'élément le plus à gauche ou le plus à droite via "$pop".

$collect->insertOne([
    '_id' => 1,
    'name' => 'gwx', 
    'age' => 30, 
    'fruits' => ['apple', 'pear']
]);

#从数组末删除1个元素
$update = [
    '$pop' => [
        'fruits' => 1
    ]
];
$collect->updateOne(['_id' => 1], $update);

# 从数组头删除一个元素
$update = [
    '$pop' => [
        'fruits' => -1
    ]
];
$collect->updateOne(['_id' => 1], $update);

Vous pouvez également supprimer l'élément spécifié via '$pull'

$collect->insertOne([
    '_id' => 1,
    'name' => 'gwx', 
    'age' => 30, 
    'fruits' => ['apple', 'pear', 'apple', 'banana', 'orange']
]);

#从数组末删除
$update = [
    '$pull' => [
        'fruits' => 'apple'
    ]
];

Tous les éléments Apple du tableau ont été supprimés

upsert

upsert est un type particulier de mise à jour. Mais si un ensemble répondant aux conditions est trouvé, ce sera le même que la modification précédente. Si aucune collection répondant aux conditions n'est trouvée, elle sera insérée dans la collection en tant que nouveau document en utilisant les conditions de requête et le document modifié.

Ci-dessous, prenons comme exemple un scénario que nous rencontrons souvent : enregistrer le nombre de fois que chaque IP est consultée. S'il s'agit d'une nouvelle IP, elle est ajoutée à la collection. Si elle existe déjà, la collection d'origine est modifiée.

$collect->updateOne(['ip' => '116.31.23.1'], [
    '$inc' =>[
        'views' => 1
    ]
], ['upsert' => true]);

$collect->updateOne(['ip' => '127.0.0.1'], [
    '$inc' =>[
        'views' => 1
    ]
], ['upsert' => true]);


$collect->updateOne(['ip' => '116.31.23.1'], [
    '$inc' =>[
        'views' => 1
    ]
], ['upsert' => true]);
> db.users.find()
{ "_id" : ObjectId("5f4336f3a95f1a505db9a2df"), "ip" : "116.31.23.1", "views" : 2 }
{ "_id" : ObjectId("5f4336f3a95f1a505db9a2e1"), "ip" : "127.0.0.1", "views" : 1 }

Mise à jour de plusieurs documents

La mise à jour de plusieurs documents nécessite l'utilisation de la méthode updateMany(), comme illustré ci-dessous :

$collect->insertMany([
    ['name' => 'gwx', 'age' => 30],
    ['name' => 'gwx', 'age' => 30],
    ['name' => 'gwx', 'age' => 30],
]);

$collect->updateMany([
    'name' => 'gwx'
],
    ['$set' =>['age' => 18]]
);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn