MongoDB findAndModify() 示例

MongoDB findAndModify() 方法根据输入的选择标准修改并返回单个文档. 返回的文档默认情况下不会显示更新内容. 如果数据库中不存在符合这些标准的记录,则将插入新的记录,如果设置为 true。

MongoDB 查找和修改( )

mongodb findAndModify 方法的语法如下。

1db.collection.findAndModify({
2    query: <document>,
3    sort: <document>,
4    new: <boolean>,
5    fields: <document>,
6    upsert: <boolean>
7})

参数的描述如下: ** 查询**: 定义需要更改的记录的选择标准。 ** 类型**: 当选择标准检索多个文档时,确定应该更改的文档。

MongoDB findAnd修改重要点

在使用 findAndModify MongoDB 调用时要记住的一些事情是:

  • 如果输入的选项标准没有提取任何文档,如果 upsert 设置为 true,则将指定值插入并创建新文档
  • 如果输入的选项标准在执行更新或删除操作时没有提取任何文档,则返回的输出值为 null.
  • 如果新选项设置为 false 并且不提到排序操作,则返回的输出值为 null.
  • 如果新选项设置为 false 并指定排序操作,则输出值为空

MongoDB findAndModify 示例

现在让我们看看一些示范 findAndModify API 的使用例子。 首先,让我们创建一些测试数据,以便开始。 我们将创建一个新的汽车文档,其中包含名称、颜色、车无(cno)、速度和制造国(mfdcountry)字段。

1db.car.insert(
2[
3{ _id: 1, name: "Alto", color: "Red",cno: "H410",speed:40,mfdcountry: "India"},
4{ _id: 2, name: "Polo", color: "White",cno: "H411",speed:45,mfdcountry: "Japan" },
5{ _id: 3, name: "Audi", color: "Black",cno: "H412",speed:50,mfdcountry: "Germany" }
6]
7)

现在让我们验证数据是否实际上是使用 mongodb find插入的:

1db.car.find()
2{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 40, "mfdcountry" : "India" }
3{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
4{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }

转向查找和修改的实际使用,我们描述了不同的可能性。 案例1:文档存在于数据库中

1db.car.findAndModify({
2query: { name: "Alto" },
3sort: { cno: 1 },
4update: { $inc: { speed: 10 } },
5})
  1. 查询在汽车集合中找到一个文档,名称字段有值Alto.
  2. 排序以上升顺序排序查询的结果. 如果多个文档符合查询条件,该方法将选择以此类别排序的第一个文档进行修改.
  3. 更新将速度字段的值增加10
  4. 该方法返回为此更新选择的原始文档 :

输出:

1{
2"_id" : 1,
3"name" : "Alto",
4"color" : "Red",
5"cno" : "H410",
6"speed" : 40,
7"mfdcountry" : "India"
8}

案例2:新选项设置为 true(返回更新的数据集)

1db.car.findAndModify({
2query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
3sort: { cno: 1 },
4update: { $inc: { speed: 20 } },
5upsert: true,
6new: true
7})

输出:

1{
2"_id" : ObjectId("546c9f347256eabc40c9da1c"),
3"cno" : "H415",
4"color" : "Silver",
5"name" : "HondaCity",
6"speed" : 45
7}

请注意,速度正在显示为 45,这是自我们将新值设置为 true 以来的更新值。如果不设置此值,则速度字段将显示为 20,虽然旧值在数据库中更新。

1db.car.findAndModify({
2query: { name: "WagonR" },
3sort: { cno: 1 },
4update: { $inc: { speed: 5 } },
5upsert: <strong>true</strong>
6})

输出:

1db.car.find();
2{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 50, "mfdcountry" : "India" }
3{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
4{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }
5{ "_id" : ObjectId("546c7c7d6be0faf69ee36546"), "name" : "WagonR", "speed" : 5 }

使用 WagonR 的汽车名称不在 db 中,因此在数据库中创建了一份新文档. 如果指定了排序选项,该方法会返回一个空的文档 { }。 如果排序选项未包含,则该方法会返回 null。

1db.car.findAndModify(
2{
3query: { name: "Alto" },
4sort: { cno: 1 },
5remove: true
6}
7)

输出:

1{
2"_id" : 1,
3"name" : "Alto",
4"color" : "Red",
5"cno" : "H410",
6"speed" : 50,
7"mfdcountry" : "India"
8}

删除字段设置为将名为Alto的文档从数据库中删除。

MongoDB findAndModify Java 示例

以上所描述的操作都是使用mongo shell手动执行的,也可以在Java中进行编程式操作,如下所示。下载mongo驱动器罐并将其添加到您的类路径中。首先,我们需要通过Mongo客户端与mongodb服务器建立连接。数据库的名称应指定为连接参数。如果数据库不存在,将创建一个新的数据库。之后,我们将添加一些记录到数据库中,并进行 findAndModify操作,然后验证这些记录是否实际更新。

 1package com.journaldev.mongodb;
 2
 3import java.net.UnknownHostException;
 4
 5import com.mongodb.BasicDBObject;
 6import com.mongodb.DB;
 7import com.mongodb.DBCollection;
 8import com.mongodb.DBCursor;
 9import com.mongodb.DBObject;
10import com.mongodb.MongoClient;
11
12public class MongoDBFindAndModify {
13
14    public static void main(String[] args) throws UnknownHostException {
15    	// Get a new connection to the db assuming it is running.
16    	MongoClient mongoClient = new MongoClient("localhost");
17    	// use test as the database. Use your database here.
18    	DB db = mongoClient.getDB("test");
19
20    	DBCollection coll = db.getCollection("car");
21    	
22    	// insert some test data to start with.
23    	BasicDBObject obj = new BasicDBObject();
24    	obj.append("name", "Volkswagen");
25    	obj.append("color", "JetBlue");
26    	obj.append("cno", "H672");
27    	obj.append("speed", 62);
28    	obj.append("mfdcountry", "Italy");
29    	coll.insert(obj);
30    	
31    	// findAndModify operation. Update colour to blue for cars having speed
32    	// < 45
33    	DBObject query = new BasicDBObject("speed",
34    			new BasicDBObject("$lt", 45));
35    	DBObject update = new BasicDBObject();
36    	update.put("$set", new BasicDBObject("color", "Blue"));
37    	DBCursor cursor = coll.find();
38    	try {
39    		while (cursor.hasNext()) {
40    			System.out.println(cursor.next());
41    		}
42    	} finally {
43    		cursor.close();
44    	}
45    	coll.findAndModify(query, update);
46    }
47}

输出:

 1//Test Data Before Insert
 2{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
 3{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
 4
 5//Test Data After insert
 6{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
 7{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
 8{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
 9
10/*Test Data Before findandModify
11{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
12{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
13{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
14{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0}
15
16/*Test Data After findAndModify
17{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
18{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
19{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
20{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0 , "color" : "Blue"}

如果您正在使用 MongoDB java 驱动程序版本 3.x,请使用下面的程序。

 1package com.journaldev.mongodb.main;
 2
 3import java.net.UnknownHostException;
 4
 5import org.bson.Document;
 6import org.bson.conversions.Bson;
 7
 8import com.mongodb.MongoClient;
 9import com.mongodb.client.FindIterable;
10import com.mongodb.client.MongoCollection;
11import com.mongodb.client.MongoDatabase;
12
13public class MongoDBFindAndModify {
14
15    public static void main(String[] args) throws UnknownHostException {
16        // Get a new connection to the db assuming it is running.
17        MongoClient mongoClient = new MongoClient("localhost");
18
19        // use test as the database. Use your database here.
20        MongoDatabase db = mongoClient.getDatabase("test");
21
22        MongoCollection<Document> coll = db.getCollection("car");
23
24        // insert some test data to start with.
25        Document obj = new Document();
26        obj.append("name", "Volkswagen");
27        obj.append("color", "JetBlue");
28        obj.append("cno", "H672");
29        obj.append("speed", 62);
30        obj.append("mfdcountry", "Italy");
31        coll.insertOne(obj);
32
33        // findAndModify operation. Update color to blue for cars having speed > 45
34        Bson query = new Document("speed",
35                new Document("$gt", 45));
36        Bson update = new Document("$set", 
37        			new Document("color", "Blue"));
38
39        System.out.println("before update");
40        findAndPrint(coll);
41
42        coll.findOneAndUpdate(query, update);
43
44        System.out.println("after update of color field");
45        findAndPrint(coll);
46
47        mongoClient.close();
48
49    }
50
51    private static void findAndPrint(MongoCollection<Document> coll) {
52    	FindIterable<Document> cursor = coll.find();
53
54    	for (Document d : cursor)
55    		System.out.println(d);
56    }
57}

Below image shows the output of above program, notice the change in color field. mongodb findAndModify example That's all for MongoDB findAndModify example, we will look into more MongoDB operations in the coming posts. Reference: MongoDB Official Documentation

Published At
Categories with 技术
Tagged with
comments powered by Disqus