MongoDB findAndModify()
在MongoDB中,`findAndModify()` 方法根据输入的选择条件修改并返回单个文档。默认情况下,返回的文档不显示更新后的内容。如果数据库中不存在符合条件的记录,并且 `upsert` 设置为 true,将插入新记录。
db.collection.findAndModify({
query: <document>,
sort: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
})
MongoDB `findAndModify` 方法的语法如下:。以下是参数的描述:query:定义需要修改的记录的选择条件。sort:确定在选择条件检索多个文档时应修改哪个文档。new:表示将显示修改后的文档。fields:指定要返回的字段集。
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 } },
})
- 查询在汽车集合中找到一个具有名称字段值为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,这是更新的值,因为我们将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"
}
删除字段设置为true后,“Alto”名称的文档将从数据库中删除。
MongoDB findAndModify Java示例
以上操作均为使用mongo shell手动执行的。在Java中,可以通过以下方式以编程方式执行相同的操作。下载mongo驱动jar并将其添加到类路径中。首先,我们需要使用Mongo客户端建立与mongodb服务器的连接。应指定数据库的名称作为连接的参数。如果数据库不存在,将创建一个新数据库。之后,我们将向数据库添加一些记录,执行findAndModify操作,然后验证记录是否实际上已更新。以下程序适用于mongo java driver版本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 driver版本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