博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongo upsert_使用Mongo Shell和Java驱动程序的MongoDB upsert示例
阅读量:2532 次
发布时间:2019-05-11

本文共 13205 字,大约阅读时间需要 44 分钟。

mongo upsert

MongoDB upsert option is used with update method which creates a new document if the query does not retrieve any documents satisfying the criteria. The default value for this option is false. The upsert option does an insert based on the field and value pairs specified in the update parameter or field and value pairs specified in both query and update parameter.

MongoDB upsert选项与update方法一起使用,如果查询未检索到任何满足条件的文档,该方法将创建一个新文档。 此选项的默认值为false。 upsert选项基于在update参数中指定的字段和值对或在query和update参数中指定的字段和值对进行插入。

设置更新的Upsert选项 (Upsert option set for update)

This operation first searches for the document if not present then inserts the new document into the database.

此操作首先搜索不存在的文档,然后将新文档插入数据库。

> db.car.update(...    { name: "Qualis" },...    {...       name: "Qualis",...       speed: 50...    },...    { upsert: true }... )WriteResult({	"nMatched" : 0,	"nUpserted" : 1,	"nModified" : 0,	"_id" : ObjectId("548d3a955a5072e76925dc1c")})>

The car with the name Qualis is checked for existence and if not, a document with car name “Qualis” and speed 50 is inserted into the database. The nUpserted with value “1” indicates a new document is inserted.

检查名称为Qualis的汽车是否存在,如果不存在,则将名称为“ Qualis”和速度50的汽车的文档插入数据库。 值为“ 1”的nUpserted表示已插入新文档。

Note that to avoid inserting the same document more than once, create an index on the name field thereby ensuring that the document will be inserted only once for the upsert option on every update specified. If the upsert fails because of duplicate index key error, retrying results in the successful update operation.

请注意,为避免多次插入同一文档,请在名称字段上创建索引,从而确保在指定的每个更新中,对于upsert选项仅将文档插入一次。 如果upsert由于重复的索引键错误而失败,则重试将导致更新操作成功。

Bulk.find.upsert() (Bulk.find.upsert())

The upsert operation can be used for multiple documents or in bulk with the methods-update, updateOne and replaceOne.

upsert操作可以用于多个文档,也可以与方法update-update,updateOne和replaceOne一起使用。

The syntax for upsert option is

upsert选项的语法是

Bulk.find(
).upsert().update(
);Bulk.find(
).upsert().updateOne(
);Bulk.find(
).upsert().replaceOne(
);

批量为find()方法设置Upsert选项 (Upsert option set for find() method in bulk)

The upsert operation for multiple documents in find method inserts a single document if the query does not satisfy the criteria as specified in the input parameter.

如果查询不满足输入参数中指定的条件,则find方法中多个文档的upsert操作将插入单个文档。

> var car = db.car.initializeUnorderedBulkOp();> car.find( { name: "Chevrolet" } ).upsert().update(...    {...      $setOnInsert: { name: "Chevrolet",speed:55,regno:567,color: "AshBrown" },...       $set: { cno:"H768" }...    }... );> car.execute();BulkWriteResult({	"writeErrors" : [ ],	"writeConcernErrors" : [ ],	"nInserted" : 0,	"nUpserted" : 1,	"nMatched" : 0,	"nModified" : 0,	"nRemoved" : 0,	"upserted" : [		{			"index" : 0,			"_id" : ObjectId("548d3b475a5072e76925dc1d")		}	]})>

This operation first initialize and creates an unordered bulk list named “car” and then calls the find method with upsert option in update. The Insert field and value pairs are specified with $setOnInsert tag to insert if the document is not present. The $set is specified to update the “cno” for the car if the document already exists. Finally bulk execute method is called to execute either the insert or update statements. Since the document is not present insertion is done first and upon that the cno is updated for the inserted record.

此操作首先初始化并创建一个名为“ car”的无序批量列表,然后在更新中使用upsert选项调用find方法。 如果没有文档,则使用$ setOnInsert标记指定插入字段和值对。 如果文档已经存在,则指定$ set来更新汽车的“ cno”。 最后,调用批量执行方法以执行插入或更新语句。 由于不存在该文档,因此首先进行插入,然后针对插入的记录更新cno。

批量为updateOne方法设置Upsert选项 (Upsert option set for updateOne method in bulk)

This method accepts parameters for updation as field/key and value pairs.

此方法接受更新参数作为字段/键和值对。

> var car = db.car.initializeUnorderedBulkOp();> car.find( { name: "Ferrari" } ).upsert().updateOne(...    {...      name: "Ferrari",...      speed:67,...      regno:456,  ...      color: "ChromeRed"...    }... );> car.execute();BulkWriteResult({	"writeErrors" : [ ],	"writeConcernErrors" : [ ],	"nInserted" : 0,	"nUpserted" : 1,	"nMatched" : 0,	"nModified" : 0,	"nRemoved" : 0,	"upserted" : [		{			"index" : 0,			"_id" : ObjectId("548d57525a5072e76925dc1e")		}	]})>

This creates an unordered bulk list with upsert option and inserts the “ferrari” document if not found in the updateOne method using the field and value pairs specified.

这将创建带有upsert选项的无序批量列表,并使用指定的字段和值对在updateOne方法中找不到的情况下插入“法拉利”文档。

使用更新运算符为updateOne设置更新 (Upsert set for updateOne using update operators)

This uses the update operators for setting the values for the fields. $setOnInsert and $set are the operators.

这将使用更新运算符来设置字段的值。 $ setOnInsert和$ set是运算符。

> var car = db.car.initializeUnorderedBulkOp();> car.find( { speed:67,regno:768} ).upsert().updateOne(...    {...      $setOnInsert: { name:"Audi"},...       $set: { speed: 89 }...    }... );> car.execute();BulkWriteResult({	"writeErrors" : [ ],	"writeConcernErrors" : [ ],	"nInserted" : 0,	"nUpserted" : 1,	"nMatched" : 0,	"nModified" : 0,	"nRemoved" : 0,	"upserted" : [		{			"index" : 0,			"_id" : ObjectId("548d57b35a5072e76925dc1f")		}	]})>

The value of name is set using $setonInsert and update is done using $set operators.

名称的值使用$ setonInsert设置,而更新使用$ set运算符完成。

批量为replaceOne方法设置Upsert选项 (Upsert option set for replaceOne method in bulk)

This performs an insert using the replaceOne method by accepting field and value pairs only as the argument.

这将使用replaceOne方法执行插入操作,方法是仅接受字段和值对作为参数。

> var car = db.car.initializeUnorderedBulkOp();> car.find( { name: "Skoda" } ).upsert().replaceOne(...    {...      name: "Skoda",...      cno: "H7865",...      speed: 80,...    }... );> car.execute();BulkWriteResult({	"writeErrors" : [ ],	"writeConcernErrors" : [ ],	"nInserted" : 0,	"nUpserted" : 1,	"nMatched" : 0,	"nModified" : 0,	"nRemoved" : 0,	"upserted" : [		{			"index" : 0,			"_id" : ObjectId("548d58205a5072e76925dc20")		}	]})>

This performs an insertion of document and this inserted document is the replacement document.

这将执行文档插入,并且此插入的文档是替换文档。

用于MongoDB的Java程序upsert (Java Program for MongoDB upsert)

In this section we will write a java program to work on the upsert option with update, updateOne and replaceOne methods.

在本节中,我们将编写一个Java程序来处理带有update,updateOne和replaceOne方法的upsert选项。

package com.journaldev.mongodb;import com.mongodb.BasicDBObject;import com.mongodb.BulkWriteOperation;import com.mongodb.DB;import com.mongodb.DBCollection;import com.mongodb.DBCursor;import com.mongodb.MongoClient;import com.mongodb.WriteResult;import java.net.UnknownHostException;public class MongoDBUpsert {	public static void upsertTrue() throws UnknownHostException {		MongoClient m1 = new MongoClient("localhost");		DB db = m1.getDB("test");		DBCollection coll = db.getCollection("car");		BasicDBObject o1 = new BasicDBObject();		o1.append("$set", new BasicDBObject("name", "Innova"));		BasicDBObject query = new BasicDBObject().append("speed", 56);		WriteResult c1 = coll.update(query, o1, true, false);		DBCursor carcursor = coll.find();		try {			while (carcursor.hasNext()) {				System.out.println(carcursor.next());			}		} finally {			carcursor.close();		}	}	public static void upsertBulkUnorderedDocsForUpdate()			throws UnknownHostException {		// Get a new connection to the db assuming that it is running		MongoClient mongoClient = new MongoClient("localhost");		// //use test as a datbase,use your database here		DB db = mongoClient.getDB("test");		// //fetch the collection object ,car is used here,use your own		DBCollection coll = db.getCollection("car");		// intialize and create a unordered bulk		BulkWriteOperation b1 = coll.initializeUnorderedBulkOperation();		BasicDBObject o1 = new BasicDBObject();		o1.append("$setOnInsert",				new BasicDBObject("name", "innova").append("speed", 54));		o1.append("$set", new BasicDBObject("cno", "H456"));		b1.find(new BasicDBObject("name", "Zen")).upsert().update(o1);		b1.execute();		DBCursor c1 = coll.find();		System.out.println("---------------------------------");		try {			while (c1.hasNext()) {				System.out.println(c1.next());			}		} finally {			c1.close();		}	}	public static void upsertBulkUnordereDocsForUpdateOne()			throws UnknownHostException {		// Get a new connection to the db assuming that it is running		MongoClient mongoClient = new MongoClient("localhost");		// use test as a database,use your database here		DB db = mongoClient.getDB("test");		// fetch the collection object ,car is used here,use your own		DBCollection coll = db.getCollection("car");		// intialize and create a unordered bulk		BulkWriteOperation b1 = coll.initializeUnorderedBulkOperation();		BasicDBObject o1 = new BasicDBObject();		o1.append(				"$setOnInsert",				new BasicDBObject("name", "Xylo").append("speed", 67).append(						"cno", "H654"));		b1.find(new BasicDBObject("name", "Xylo")).upsert().updateOne(o1);		b1.execute();		DBCursor c1 = coll.find();		System.out.println("---------------------------------");		try {			while (c1.hasNext()) {				System.out.println(c1.next());			}		} finally {			c1.close();		}	}	public static void upsertBulkForUpdateOneWithOperators()			throws UnknownHostException {		// Get a new connection to the db assuming that it is running		MongoClient mongoClient = new MongoClient("localhost");		// //use test as a datbase,use your database here		DB db = mongoClient.getDB("test");		// //fetch the collection object ,car is used here,use your own		DBCollection coll = db.getCollection("car");		// intialize and create a unordered bulk		BulkWriteOperation b1 = coll.initializeOrderedBulkOperation();		BasicDBObject o1 = new BasicDBObject();		// insert if document not found and set the fields with updated value		o1.append("$setOnInsert", new BasicDBObject("cno", "H123"));		o1.append("$set", new BasicDBObject("speed", "63"));		b1.find(new BasicDBObject("name", "Santro").append("speed", 654))				.upsert().updateOne(o1);		b1.execute();		DBCursor c1 = coll.find();		System.out.println("---------------------------------");		try {			while (c1.hasNext()) {				System.out.println(c1.next());			}		} finally {			c1.close();		}	}	public static void upsertBulkUnorderedDocsForReplaceOne()			throws UnknownHostException {		// Get a new connection to the db assuming that it is running		MongoClient mongoClient = new MongoClient("localhost");		// //use test as a datbase,use your database here		DB db = mongoClient.getDB("test");		// fetch the collection object ,car is used here,use your own		DBCollection coll = db.getCollection("car");		// intialize and create a unordered bulk		BulkWriteOperation b1 = coll.initializeOrderedBulkOperation();		// insert query		BasicDBObject o1 = new BasicDBObject("name", "Qualis").append("speed",				76).append("color", "Palebrown");		b1.find(new BasicDBObject("name", "Qualis")).upsert().replaceOne(o1);		b1.execute();		DBCursor c1 = coll.find();		System.out.println("---------------------------------");		try {			while (c1.hasNext()) {				System.out.println(c1.next());			}		} finally {			c1.close();		}	}	public static void main(String[] args) throws UnknownHostException {		// invoke all the methods		upsertTrue();		upsertBulkUnorderedDocsForUpdate();		upsertBulkUnordereDocsForUpdateOne();		upsertBulkForUpdateOneWithOperators();		upsertBulkUnorderedDocsForReplaceOne();	}}

Output of the above program when executed for a collection that doesn’t exists produce following results.

对不存在的集合执行上述程序时,其输出将产生以下结果。

{ "_id" : { "$oid" : "548d59285a5072e76925dc25"} , "speed" : 56 , "name" : "Innova"}---------------------------------{ "_id" : { "$oid" : "548d59285a5072e76925dc25"} , "speed" : 56 , "name" : "Innova"}{ "_id" : { "$oid" : "548d59285a5072e76925dc26"} , "name" : "innova" , "speed" : 54 , "cno" : "H456"}---------------------------------{ "_id" : { "$oid" : "548d59285a5072e76925dc25"} , "speed" : 56 , "name" : "Innova"}{ "_id" : { "$oid" : "548d59285a5072e76925dc26"} , "name" : "innova" , "speed" : 54 , "cno" : "H456"}{ "_id" : { "$oid" : "548d59285a5072e76925dc27"} , "name" : "Xylo" , "speed" : 67 , "cno" : "H654"}---------------------------------{ "_id" : { "$oid" : "548d59285a5072e76925dc25"} , "speed" : 56 , "name" : "Innova"}{ "_id" : { "$oid" : "548d59285a5072e76925dc26"} , "name" : "innova" , "speed" : 54 , "cno" : "H456"}{ "_id" : { "$oid" : "548d59285a5072e76925dc27"} , "name" : "Xylo" , "speed" : 67 , "cno" : "H654"}{ "_id" : { "$oid" : "548d59285a5072e76925dc28"} , "name" : "Santro" , "speed" : "63" , "cno" : "H123"}---------------------------------{ "_id" : { "$oid" : "548d59285a5072e76925dc25"} , "speed" : 56 , "name" : "Innova"}{ "_id" : { "$oid" : "548d59285a5072e76925dc26"} , "name" : "innova" , "speed" : 54 , "cno" : "H456"}{ "_id" : { "$oid" : "548d59285a5072e76925dc27"} , "name" : "Xylo" , "speed" : 67 , "cno" : "H654"}{ "_id" : { "$oid" : "548d59285a5072e76925dc28"} , "name" : "Santro" , "speed" : "63" , "cno" : "H123"}{ "_id" : { "$oid" : "548d59285a5072e76925dc29"} , "name" : "Qualis" , "speed" : 76 , "color" : "Palebrown"}

That’s all for MongoDB upsert method with different scenario examples, we will look into more of MongoDB features in coming posts.

以上就是针对不同场景示例的MongoDB upsert方法的全部内容,我们将在以后的文章中探讨更多MongoDB功能。

翻译自:

mongo upsert

转载地址:http://uuqzd.baihongyu.com/

你可能感兴趣的文章
编译Libgdiplus遇到的问题
查看>>
【NOIP 模拟赛】Evensgn 剪树枝 树形dp
查看>>
java学习笔记④MySql数据库--01/02 database table 数据的增删改
查看>>
两台电脑如何实现共享文件
查看>>
组合模式Composite
查看>>
程序员最想得到的十大证件,你最想得到哪个?
查看>>
我的第一篇CBBLOGS博客
查看>>
【MyBean调试笔记】接口的使用和清理
查看>>
07 js自定义函数
查看>>
jQueru中数据交换格式XML和JSON对比
查看>>
form表单序列化后的数据转json对象
查看>>
[PYTHON]一个简单的单元測试框架
查看>>
iOS开发网络篇—XML数据的解析
查看>>
[BZOJ4303]数列
查看>>
一般处理程序在VS2012中打开问题
查看>>
C语言中的++和--
查看>>
thinkphp3.2.3入口文件详解
查看>>
POJ 1141 Brackets Sequence
查看>>
Ubuntu 18.04 root 使用ssh密钥远程登陆
查看>>
Servlet和JSP的异同。
查看>>