ホームページ  >  記事  >  データベース  >  MongoDBドキュメントの更新(phpコード例)

MongoDBドキュメントの更新(phpコード例)

齐天大圣
齐天大圣オリジナル
2020-08-24 14:39:332353ブラウズ

MongoDB 更新ドキュメントは 2 つのカテゴリに分類されます:

  • ドキュメント置換、古いドキュメントを新しいドキュメントで完全に置き換えます

  • Modifier、一部のドキュメントを変更する

ドキュメント置換

ドキュメント置換の使用は非常に簡単です。デモを見てみましょう。

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

修飾子を使用して、キーの変更、追加、削除など、より複雑な更新操作を完了します。

"$set" 修飾子

"$set" は、フィールドの値を指定するために使用されます。このフィールドが存在しない場合は作成します。

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

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

今のリンゴが気に入らず、イチゴに変更したい場合は、

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

"$set" でキーの種類を変更することもできます。

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

"$set" は埋め込みドキュメントも変更できます

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

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

"$unset"Modifier

Use" $ unset" 修飾子は、指定されたフィールドを削除できます

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

"$inc" 修飾子、値を増減させることができます

および "$set" のように修飾子。フィールドが存在しない場合は、自動的に作成されます。注: このフィールド値には数値のみを使用できます。

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

これで10ポイント獲得できました。

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

後で、50 ポイントが使用されました

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

Array Modifier

MongoDB は、配列メソッドに特別な変更を提供します。

"$push" は要素を追加します

"$push" は配列に要素を追加できます。配列が存在しない場合は、自動的に配列を作成します。記事データを保存するために使用されるドキュメントがあります:

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

"$each" は複数の要素を追加します

'$push' は、 array at Once 要素、複数の要素を一度に追加したい場合は、'$each' を一緒に使用する必要があります。

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

「$slice」は n 個の要素を保持します

「$push」は「$slicet」と一緒に使用され、最新の n 個の要素が保持されますデータ、'$slice' の値は負の整数のみです。たとえば、最新の 3 件のコメントのみを保持したいとします。

# 目前数据如下
 > 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" ] }

"$sort"sorting

は '$ とともに使用することもできます。並べ替え」では、「いいね!」が最も多かった 3 つのコメントを保持します。

# 目前是集合内是空的,么有任何文档
$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]
        ],
    ],
];

コレクション内のデータがどのようなものかを見てみましょう:

> 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 } ] }

「$slice」または「$sort」と「$push」だけを使用することはできないことに注意してください。 "、"$each" を使用する必要があります。

「$addToSet」は重複データの挿入を回避します

「$addToSet」を使用して新しい配列要素を追加する場合、重複データの挿入を回避できます。

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

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

などの重複データを追加すると、apple がすでに存在するため、上記の変更は成功しません。 「$addToSet」を「$each」と一緒に使用して、複数の配列要素を挿入することもできます。

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

要素の削除

「$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);

「$pull」を使用して指定した要素を削除することもできます

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

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

配列内のすべてのリンゴ要素が削除されました

upsert

upsert は特別な種類の更新です。ただし、条件を満たすセットが見つかった場合は、前回の変更と同じになります。条件を満たすコレクションが見つからない場合は、クエリ条件と変更されたドキュメントを使用して、新しいドキュメントとしてコレクションに挿入されます。

以下では、よく遭遇するシナリオを例として取り上げます。各 IP が表示された回数を記録します。新しい IP の場合はコレクションに追加され、既に存在する場合は元のコレクションが変更されます。

$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 }

複数のドキュメントを更新する

複数のドキュメントを更新するには、次に示すように、updateMany() メソッドを使用する必要があります。

以上がMongoDBドキュメントの更新(phpコード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。