ネイティブな日本語で以下を言い換えてください。オプションは1つだけです:MongoDBのfindAndModify()の例
MongoDBのfindAndModify()メソッドは、入力された選択条件に基づいて単一のドキュメントを修正および返します。返されたドキュメントはデフォルトでは更新後の内容を表示しません。データベース内で条件に一致するレコードが存在しない場合、upsertがtrueに設定されている場合、新しいレコードが挿入されます。
ネイティブな日本語で以下の文を言い換えます。1つのオプションのみ必要です:
「MongoDBのfindAndModify()メソッド」
mongodbのfindAndModifyメソッドの構文は次のようになります。
db.collection.findAndModify({
query: <document>,
sort: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
})
パラメータの説明は以下の通りです。query:どのレコードを変更する必要があるかを選択基準として定義します。sort:選択基準が複数のドキュメントを取得する場合に、どのドキュメントを変更するかを決定します。new:変更されたドキュメントが表示されることを示します。fields:返されるフィールドのセットを指定します。upsert:選択基準がドキュメントを取得できない場合に新しいドキュメントを作成します。
MongoDBのfindAndModifyの重要なポイント
MongoDBのfindAndModify呼び出しを使用する際に心に留めておくべきことはいくつかあります。
- If the entered selection criteria does not fetch any document and if upsert is set to true, then the specified values are inserted and a new document is created.
- If the entered selection criteria does not fetch any document while performing update or remove operations, the output returned is null.
- If the new option is set to false and sort operation is not mentioned, the output returned is null.
- If the new option is set to false and sort operation is specified, the output is empty.
MongoDBのfindAndModifyの例
今、findAndModify APIの使用方法を示すいくつかの例を見てみましょう。まずは、テストデータを作成しましょう。モンゴコンソールを通じて、名前、色、車の番号(cno)、速度、および製造国(mfdcountry)のフィールドを持つ新しい車のドキュメントを作成します。
db.car.insert(
[
{ _id: 1, name: "Alto", color: "Red",cno: "H410",speed:40,mfdcountry: "India"},
{ _id: 2, name: "Polo", color: "White",cno: "H411",speed:45,mfdcountry: "Japan" },
{ _id: 3, name: "Audi", color: "Black",cno: "H412",speed:50,mfdcountry: "Germany" }
]
)
今、MongoDBのfindを使用してデータが実際に挿入されたことを確認しましょう。
db.car.find()
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 40, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }
実際の「検索して変更する」の使用方法に移りますが、私たちはさまざまな可能性を描きます。ケース1:ドキュメントはデータベースに存在しています。
db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
-
- クエリは、名前フィールドの値が「Alto」となっている車のコレクション内の文書を検索します。
-
- ソートは、クエリ結果を昇順で並べ替えます。複数の文書がクエリ条件に一致する場合、このソートに従って最初の文書が変更の対象として選択されます。
-
- アップデートは、速度フィールドの値を10増加させます。
- このアップデートのために選択されたもともとの文書がメソッドから返されます。
出力:
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 40,
"mfdcountry" : "India"
}
ケース2:新しいオプションをtrueに設定する(更新されたデータセットを返す)
db.car.findAndModify({
query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
sort: { cno: 1 },
update: { $inc: { speed: 20 } },
upsert: true,
new: true
})
出力:
{
"_id" : ObjectId("546c9f347256eabc40c9da1c"),
"cno" : "H415",
"color" : "Silver",
"name" : "HondaCity",
"speed" : 45
}
速度は45と表示されていますが、これは新しい値として設定したためです。もし設定されていない場合、データベースで更新される前の値である20が表示されます。ケース3では、upsertはtrueに設定されています。
db.car.findAndModify({
query: { name: "WagonR" },
sort: { cno: 1 },
update: { $inc: { speed: 5 } },
upsert: <strong>true</strong>
})
出力:
db.car.find();
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 50, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }
{ "_id" : ObjectId("546c7c7d6be0faf69ee36546"), "name" : "WagonR", "speed" : 5 }
WagonRの車名はデータベースに存在しないため、新しい文書がデータベースに作成されます。ソートオプションが指定されている場合は、メソッドは空の文書「{}」を返します。ソートオプションが含まれていない場合は、メソッドはnullを返します。これに加えて、ソートと削除の操作にも使用することができます。削除フィールドがtrueに設定されている場合、指定された条件の車名がデータベースから削除されます。
db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)
以下の文を日本語で完全に言い換えてください(一つのオプションだけで構いません):
出力:
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}
「削除」フィールドが「true」に設定されている場合、データベースから「Alto」という名前のドキュメントが削除されます。
ネイティブな日本語で以下を言い換えます(一つのオプションのみ):
MongoDBのfindAndModifyのJavaの例
上記で示されている操作は、すべてmongo shellを使用して手動で行われています。同じ操作をJavaでプログラムを使って行うこともできます。まず、Mongoドライバーのjarファイルをダウンロードし、クラスパスに追加する必要があります。次に、Mongoクライアントを使用してmongodbサーバーに接続するための接続を確立する必要があります。接続のためには、データベースの名前をパラメータとして指定する必要があります。データベースが存在しない場合、新しいデータベースが作成されます。その後、いくつかのレコードをデータベースに追加し、findAndModify操作を行い、レコードが実際に更新されたかどうかを検証します。以下のプログラムは、mongo javaドライバーのバージョン2.xで動作します。
package com.scdev.mongodb;
import java.net.UnknownHostException;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
public class MongoDBFindAndModify {
public static void main(String[] args) throws UnknownHostException {
// Get a new connection to the db assuming it is running.
MongoClient mongoClient = new MongoClient("localhost");
// use test as the database. Use your database here.
DB db = mongoClient.getDB("test");
DBCollection coll = db.getCollection("car");
// insert some test data to start with.
BasicDBObject obj = new BasicDBObject();
obj.append("name", "Volkswagen");
obj.append("color", "JetBlue");
obj.append("cno", "H672");
obj.append("speed", 62);
obj.append("mfdcountry", "Italy");
coll.insert(obj);
// findAndModify operation. Update colour to blue for cars having speed
// < 45
DBObject query = new BasicDBObject("speed",
new BasicDBObject("$lt", 45));
DBObject update = new BasicDBObject();
update.put("$set", new BasicDBObject("color", "Blue"));
DBCursor cursor = coll.find();
try {
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
} finally {
cursor.close();
}
coll.findAndModify(query, update);
}
}
結果:
//Test Data Before Insert
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
//Test Data After insert
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
/*Test Data Before findandModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0}
/*Test Data After findAndModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0 , "color" : "Blue"}
もしMongoDBのJavaドライバのバージョンが3.xを使用している場合、以下のプログラムを利用してください。
package com.scdev.mongodb.main;
import java.net.UnknownHostException;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class MongoDBFindAndModify {
public static void main(String[] args) throws UnknownHostException {
// Get a new connection to the db assuming it is running.
MongoClient mongoClient = new MongoClient("localhost");
// use test as the database. Use your database here.
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection<Document> coll = db.getCollection("car");
// insert some test data to start with.
Document obj = new Document();
obj.append("name", "Volkswagen");
obj.append("color", "JetBlue");
obj.append("cno", "H672");
obj.append("speed", 62);
obj.append("mfdcountry", "Italy");
coll.insertOne(obj);
// findAndModify operation. Update color to blue for cars having speed > 45
Bson query = new Document("speed",
new Document("$gt", 45));
Bson update = new Document("$set",
new Document("color", "Blue"));
System.out.println("before update");
findAndPrint(coll);
coll.findOneAndUpdate(query, update);
System.out.println("after update of color field");
findAndPrint(coll);
mongoClient.close();
}
private static void findAndPrint(MongoCollection<Document> coll) {
FindIterable<Document> cursor = coll.find();
for (Document d : cursor)
System.out.println(d);
}
}