MongoDB findAndModify() 示例

MongoDB 的 findAndModify() 方法根据输入的选择条件修改并返回单个文档。返回的文档默认不显示更新后的内容。如果数据库中不存在符合条件的记录,并且 upsert 设置为 true,则会插入一条新记录。

MongoDB findAndModify()

mongodb findAndModify 方法的语法如下。

db.collection.findAndModify({
    query: <document>,
    sort: <document>,
    new: <boolean>,
    fields: <document>,
    upsert: <boolean>
})

参数的描述如下。query:定义需要修改的记录的选择条件。sort:确定当选择条件检索到多个文档时,应该修改哪个文档。new:指示将显示修改后的文档。fields:指定要返回的字段集。upsert:如果选择条件无法检索到文档,则创建一个新文档。

MongoDB findAndModify 的重要点

使用 findAndModify MongoDB 调用时需注意以下几点:

  • 如果輸入的選擇條件未檢索到任何文件,並且如果 upsert 設置為 true,則插入指定的值並創建一個新的文件。
  • 如果在執行更新或刪除操作時,輸入的選擇條件未檢索到任何文件,則返回的輸出為 null。
  • 如果將 new 選項設置為 false,並且未指定排序操作,則返回的輸出為 null。
  • 如果將 new 選項設置為 false,並且指定了排序操作,則返回的輸出為空。

MongoDB findAndModify 示例

現在讓我們看一些示例,演示 findAndModify API 的用法。首先,讓我們創建一些測試數據。我們將通過 mongo 控制台創建一個新的汽車文檔,包含名稱、顏色、車牌號(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" }

繼續使用 find 和 modify,我們描述不同的可能性。情況 1:數據庫中存在該文檔

db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
  1. 查詢在汽車集合中找到了名稱字段值為 Alto 的文檔。
  2. 排序按照查询结果的升序排列。如果多个文档符合查询条件,该方法将选择按照此排序顺序修改的第一个文档。
  3. 更新将速度字段的值增加10。
  4. 该方法返回被选中进行此更新的原始文档:

输出:

{
"_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,这是更新后的值,因为我们将new设置为true。如果未设置此选项,则速度字段将显示为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的汽车名称,因此在数据库中创建了一个新文档。如果指定了sort选项,则该方法返回一个空文档{ }。如果未包括sort选项,则该方法返回null。除此之外,还可以用于进行排序和删除操作。如果将remove字段设置为true,则将根据指定的条件从数据库中删除具有该条件的汽车名称。

db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)

输出:

{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}

将remove字段设置为true,名为“Alto”的文档将从数据库中删除。

MongoDB findAndModify Java示例

以上所描繪的操作都是通過mongo shell手動執行的。同樣的操作也可以在Java中以程式化的方式完成。下載mongo驅動程式jar並將其加入您的類別路徑。首先,我們需要使用Mongo客戶端連接到mongodb伺服器。連接的參數應該指定資料庫的名稱。如果資料庫不存在,將創建一個新的資料庫。之後,我們將添加一些記錄到資料庫中,並進行findAndModify操作,然後驗證記錄是否真實更新。以下程式碼適用於mongo java驅動程式版本2.x。

package com.journaldev.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 {
		//假定它正在運行,獲取與資料庫的新連接。
		MongoClient mongoClient = new MongoClient("localhost");
		//使用test作為資料庫。在此處使用您的資料庫。
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		//首先插入一些測試資料。
		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操作。將速度
		// < 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);
	}
}

輸出:

//插入前的測試資料
{ "_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" : 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.journaldev.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 {
        //假定它正在運行,獲取與資料庫的新連接。
        MongoClient mongoClient = new MongoClient("localhost");
        
        //使用test作為資料庫。在此處使用您的資料庫。
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection coll = db.getCollection("car");
         
        //首先插入一些測試資料。
        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操作。將速度 > 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 coll) {
		FindIterable cursor = coll.find();
        
		for (Document d : cursor)
			System.out.println(d);
	}
}

下圖顯示了上述程式的輸出,請注意顏色欄位的變化。這就是MongoDB findAndModify的範例,我們將在接下來的文章中介紹更多MongoDB操作。參考資料:MongoDB官方文件

Source:
https://www.digitalocean.com/community/tutorials/mongodb-findandmodify-example