MongoDB中的push操作詳解(將文檔插入到數(shù)組)
1. 概述
在本教程中,我們將介紹如何在MongoDB中將文檔插入到數(shù)組中。此外,我們將看到 $push 和 $addToset 運(yùn)算符用于將值添加到數(shù)組中的各種應(yīng)用。
首先,我們將創(chuàng)建一個(gè)示例數(shù)據(jù)庫(kù)、一個(gè)集合,并將虛擬數(shù)據(jù)插入其中。此外,我們將研究一些使用 $push 運(yùn)算符更新文檔的基本示例。稍后,我們還將討論 $push 和 $addtoSet 運(yùn)算符的各種用例。
讓我們深入研究在 MongoDB 中將文檔插入數(shù)組的各種方法。
2. 數(shù)據(jù)庫(kù)初始化
首先,讓我們建立一個(gè)新的數(shù)據(jù)庫(kù)baeldung和一個(gè)樣本集合,orders:
use baeldung; db.createCollection(orders);
現(xiàn)在讓我們使用insertMany方法將一些文檔添加到集合中:
db.orders.insertMany([
{
"customerId": 1023,
"orderTimestamp": NumberLong("1646460073000"),
"shippingDestination": "336, Street No.1 Pawai Mumbai",
"purchaseOrder": 1000,
"contactNumber":"9898987676",
"items": [
{
"itemName": "BERGER",
"quantity": 1,
"price": 500
},
{
"itemName": "VEG PIZZA",
"quantity": 1,
"price": 800
}
]
},
{
"customerId": 1027,
"orderTimestamp": NumberLong("1646460087000"),
"shippingDestination": "445, Street No.2 Pawai Mumbai",
"purchaseOrder": 2000,
"contactNumber":"9898987676",
"items": [
{
"itemName": "BERGER",
"quantity": 1,
"price": 500
},
{
"itemName": "NON-VEG PIZZA",
"quantity": 1,
"price": 1200
}
]
}
]);
如果插入成功,上面的命令將打印一個(gè)類似于下面的 JSON:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
至此,我們已經(jīng)成功建立了數(shù)據(jù)庫(kù)和集合。我們將在所有示例中使用這個(gè)數(shù)據(jù)庫(kù)和集合。
3. 使用 Mongo Query 進(jìn)行推送操作
MongoDB 提供了各種類型的數(shù)組運(yùn)算符來更新 MongoDB 文檔中的數(shù)組。 MongoDB 中的 $push 運(yùn)算符將值附加到數(shù)組的末尾。根據(jù)查詢的類型,我們可以將$push運(yùn)算符與updateOne、updateMany、findAndModify 等方法一起使用。
現(xiàn)在讓我們看看使用*$push*運(yùn)算符的 shell 查詢:
db.orders.updateOne(
{
"customerId": 1023
},
{
$push: {
"items":{
"itemName": "PIZZA MANIA",
"quantity": 1,
"price": 800
}
}
});
上述查詢將返回以下文檔:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
現(xiàn)在讓我們查看customerId 為 1023的文檔。在這里,我們可以看到新項(xiàng)目插入到列表“ items ”的末尾:
{
"customerId" : 1023,
"orderTimestamp" : NumberLong("1646460073000"),
"shippingDestination" : "336, Street No.1 Pawai Mumbai",
"purchaseOrder" : 1000,
"contactNumber" : "9898987676",
"items" : [
{
"itemName" : "BERGER",
"quantity" : 1,
"price" : 500
},
{
"itemName" : "VEG PIZZA",
"quantity" : 1,
"price" : 800
},
{
"itemName" : "PIZZA MANIA",
"quantity" : 1,
"price" : 800
}
]
}
4. 使用Java驅(qū)動(dòng)代碼進(jìn)行推送操作
到目前為止,我們已經(jīng)討論了將文檔推送到數(shù)組中的 MongoDB shell 查詢。現(xiàn)在讓我們使用 Java 代碼實(shí)現(xiàn)推送更新查詢。
在執(zhí)行更新操作之前,我們先連接到 baeldung數(shù)據(jù)庫(kù)中的orders集合:
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");
在這里,在這種情況下,我們連接到在 localhost 的默認(rèn)端口 27017 上運(yùn)行的 MongoDB。
4.1. 使用 DBObject
MongoDB Java 驅(qū)動(dòng)程序提供對(duì)DBObject和BSON文檔的支持。在這里,DBObject是 MongoDB 舊版驅(qū)動(dòng)程序的一部分,但在較新版本的 MongoDB 中已棄用。
現(xiàn)在讓我們看看 Java 驅(qū)動(dòng)程序代碼以將新值插入到數(shù)組中:
DBObject listItem = new BasicDBObject("items", new BasicDBObject("itemName", "PIZZA MANIA")
.append("quantity", 1)
.append("price", 800));
BasicDBObject searchFilter = new BasicDBObject("customerId", 1023);
BasicDBObject updateQuery = new BasicDBObject();
updateQuery.append("$push", listItem);
UpdateResult updateResult = collection.updateOne(searchFilter, updateQuery);
在上面的查詢中,我們首先使用BasicDBObject創(chuàng)建了項(xiàng)目文檔。在searchQuery 的基礎(chǔ)上,對(duì)集合的文檔進(jìn)行過濾,并將值推送到數(shù)組中。
4.2. 使用 BSON 文檔
BSON文檔是訪問 Java 中的 MongoDB 文檔的新方法,它是使用較新的客戶端堆棧構(gòu)建的。org.bson.Document類不太復(fù)雜且更易于使用。
讓我們使用org.bson.Document 類將值推送到數(shù)組“ items”中:
Document item = new Document()
.append("itemName1", "PIZZA MANIA")
.append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection.updateOne(Filters.eq("customerId", 1023), Updates.push("items", item));
在這種情況下,BSON的實(shí)現(xiàn)類似于使用DBObject 運(yùn)行的代碼,更新也將是相同的。在這里,我們使用updateOne方法僅更新單個(gè)文檔。
5. 使用 addToSet操作符
$addToSet運(yùn)算符也可用于將值壓入數(shù)組。僅當(dāng)數(shù)組中不存在該值時(shí),此運(yùn)算符才添加值。否則,它只會(huì)忽略它。而推送運(yùn)算符將推送值作為過濾條件以獲取匹配。
需要注意的一個(gè)關(guān)鍵點(diǎn)是 $addToSet 運(yùn)算符在重復(fù)項(xiàng)目的情況下不會(huì)推送值工作。另一方面,$push 運(yùn)算符只是將值推送到數(shù)組中,而不考慮任何其他條件。
5.1. 使用addToSet運(yùn)算符的 Shell 查詢
$addToSet 運(yùn)算符的 mongo shell 查詢類似于 $push 運(yùn)算符,但 $addToSet 不會(huì)在數(shù)組中插入重復(fù)值。
現(xiàn)在讓我們檢查一下 MongoDB 查詢,以使用&$addToset*將值推送到數(shù)組中:
db.orders.updateOne(
{
"customerId": 1023
},
{
$addToSet: {
"items":{
"itemName": "PASTA",
"quantity": 1,
"price": 1000
}
}
});
在這種情況下,輸出將如下所示:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
在這種情況下,我們使用了 $addToSet 運(yùn)算符,只有當(dāng)文檔是唯一的時(shí),才會(huì)將其推送到數(shù)組“items”中。
5.2. 使用addToSet運(yùn)算符的 Java 驅(qū)動(dòng)程序
$addToSet操作符提供了一種與推送操作符不同類型的數(shù)組更新操作:
Document item = new Document()
.append("itemName1", "PIZZA MANIA")
.append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection
.updateOne(Filters.eq("customerId", 1023), Updates.addToSet("items", item));
System.out.println("updateResult:- " + updateResult);
在上面的代碼中,首先我們創(chuàng)建了文檔“item”,在customerId過濾器的基礎(chǔ)上,updateOne方法會(huì)嘗試將文檔“item”推送到數(shù)組“items”中。
6. 結(jié)論
在本文中,我們學(xué)習(xí)了使用 $push 和 $addToSet 運(yùn)算符將新值推送到數(shù)組中。首先,我們研究了 $push 運(yùn)算符在 MongoDB shell 查詢中的使用,然后我們討論了相應(yīng)的 Java 驅(qū)動(dòng)程序代碼。
總結(jié)
到此這篇關(guān)于MongoDB中的push操作詳解的文章就介紹到這了,更多相關(guān)MongoDB push操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mongoDB 多重?cái)?shù)組查詢(AngularJS綁定顯示 nodejs)
這篇文章主要介紹了mongoDB 多重?cái)?shù)組查詢(AngularJS綁定顯示 nodejs),需要的朋友可以參考下2017-06-06
MongoDB數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)整理
這篇文章介紹了MongoDB數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
一文帶你深入掌握MongoDB查詢分析的關(guān)鍵技巧
MongoDB 是一款靈活且可擴(kuò)展的NoSQL數(shù)據(jù)庫(kù),為了提高其性能,我們可以采取一些優(yōu)化技巧,這篇文章主要給大家介紹了關(guān)于MongoDB查詢分析關(guān)鍵技巧的相關(guān)資料,需要的朋友可以參考下2024-06-06
MongoDB創(chuàng)建一個(gè)索引而性能提升1000倍示例代碼
這篇文章主要給大家介紹了關(guān)于如何在MongoDB中創(chuàng)建一個(gè)索引而性能提升1000倍的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
MongoDB客戶端工具NoSQL?Manager?for?MongoDB介紹
這篇文章介紹了MongoDB客戶端工具NoSQL?Manager?for?MongoDB,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
教你使用MongoDB導(dǎo)入導(dǎo)出備份數(shù)據(jù)
這篇文章主要介紹了教你使用MongoDB導(dǎo)入導(dǎo)出備份數(shù)據(jù)方法的相關(guān)資料,需要的朋友可以參考下2022-11-11
MongoDB快速入門筆記(三)之MongoDB插入文檔操作
這篇文章主要介紹了MongoDB快速入門筆記(三)之MongoDB插入文檔操作 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
利用MongoDB中oplog機(jī)制實(shí)現(xiàn)準(zhǔn)實(shí)時(shí)數(shù)據(jù)的操作監(jiān)控
MongoDB 的Replication是通過一個(gè)日志來存儲(chǔ)寫操作的,這個(gè)日志就叫做oplog,而下面這篇文章主要給大家介紹了利用MongoDB中oplog機(jī)制實(shí)現(xiàn)準(zhǔn)實(shí)時(shí)數(shù)據(jù)的操作監(jiān)控的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-05-05

