MongoDB的findAndModify()函数示例

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

MongoDB的findAndModify()函数

mongodb的findAndModify方法的语法如下。

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

以下是参数的描述。
查询:定义了需要修改的记录的选择条件。
排序:确定当选择条件检索到多个文档时应该修改哪个文档。
新建:表示将显示修改后的文档。
字段:指定要返回的字段集。
插入更新:如果选择条件未能检索到文档,则创建一个新文档。

MongoDB findAndModify的重要点如下:

– findAndModify是一个原子性操作,可以在单个操作中找到并修改文档。
– 它可以用来更新文档中的字段值,也可以用于替换整个文档。
– 通过指定查询条件,可以限定要更改的文档范围。
– 操作可以返回修改前的文档或修改后的文档,也可以只返回修改前/后的某些字段。
– findAndModify可以保证在并发情况下操作的一致性和完整性。
– 它还支持对多个文档进行批量操作,可以通过设置选项来指定具体的排序和限制条件。

使用findAndModify MongoDB调用时需要记住的一些事项有:

  • 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 API的示例。首先,让我们创建一些测试数据来开始。我们将通过mongo控制台创建一个带有名字、颜色、车牌号、速度和制造国家字段的新车文档。

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的查找功能来验证数据是否确实被插入了。

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 } },
})
    查询在汽车收藏中找到一个name字段值为Alto的文档。
    排序按查询结果升序排列。如果有多个文档满足查询条件,该方法将选择按此排序顺序进行修改的第一个文档。
    更新将speed字段的值增加10。
    该方法返回被选中进行此次更新的原始文档。

输出: 只需要一个选择。

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

情况2:新的选项设置为真(返回更新后的数据集)

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的车名,则会在数据库中创建一个新文档。如果指定了排序选项,该方法将返回一个空文档{}。如果不包含排序选项,则该方法将返回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"
}

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

MongoDB findAndModify Java 示例

上述操作完全是使用Mongo Shell手动执行的。同样的操作也可以在Java程序中以编程方式完成,具体如下。首先,下载Mongo驱动程序jar文件并将其添加到类路径中。然后,我们需要使用Mongo客户端建立与MongoDB服务器的连接。连接时需要指定数据库的名称作为参数。如果数据库不存在,将会创建一个新的数据库。之后,我们将向数据库添加一些记录,并进行“findAndModify”操作,然后验证记录是否被实际更新。以下程序适用于Mongo Java驱动程序版本2.x。

package com.Olivia.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.Olivia.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);
	}
}
mongodb findAndModify example
发表回复 0

Your email address will not be published. Required fields are marked *