插入操作
Overview
在本指南中,您可以了解如何使用 MongoDB Kotlin 驱动程序插入文档。
您可以使用 MongoDB 检索、更新和删除信息。 要执行任何这些操作,用户配置文件和订单等信息需要存在于 MongoDB 中。 要使该信息存在,您需要首先执行插入操作。
插入操作使用 insertOne()
、 insertMany()
和bulkWrite()
方法将单个或多个文档插入到 MongoDB 中。
以下部分重点介绍insertOne()
和insertMany()
。 有关如何使用bulkWrite()
方法的信息,请参阅我们的批量操作指南。
在以下示例中,一家油漆店库存有不同颜色的油漆。 此数据使用以下 Kotlin 数据类进行建模:
data class PaintOrder( val id: ObjectId? = null, val qty: Int, val color: String )
关于以下项的说明: _id
插入文档时,MongoDB 默认对文档实施一项约束:每个文档必须包含唯一的_id
字段。
管理该字段有两种方法:
您可以自己管理该字段,确保使用的每个值都是唯一的。
您可以让驱动程序自动生成唯一的 ObjectId 值。
除非您为唯一性提供了强有力的保证,否则我们建议让驱动程序自动生成 _id
值。
注意
重复的 _id
值违反了唯一索引约束,这会导致 WriteError
。
有关唯一索引的更多信息,请参阅有关唯一索引的手册条目。
插入单一文档
如果要插入单个文档,请使用 insertOne()
方法。
成功插入后,该方法将返回一个InsertOneResult
实例,该实例表示新文档的_id
。
例子
以下示例使用insertOne()
方法创建并插入文档:
val paintOrder = PaintOrder(ObjectId(), 5, "red") val result = collection.insertOne(paintOrder) val insertedId = result.insertedId?.asObjectId()?.value println("Inserted a document with the following id: $insertedId")
Inserted a document with the following id: 60930c39a982931c20ef6cd6
有关部分提及的方法和类的更多信息,请参阅以下资源:
insertOne() API 文档
InsertOneResult API 文档
insertOne()手册解释
可运行的插入文档示例
插入多个文档
如果要插入多份文档,请使用 insertMany()
方法。此方法将按指定的顺序插入文档,直到发生异常(如果有)。
例如,假设您要插入以下文档:
{ "color": "red", "qty": 5 } { "color": "purple", "qty": 10 } { "color": "yellow", "qty": 3 } { "color": "blue", "qty": 8 }
如果您尝试插入这些文档,则在插入第三个文档时会发生WriteError
,并且发生错误之前的文档仍会插入到您的集合中。
提示
在错误发生之前,使用 try-catch 块获取已成功处理文档的确认。 输出由 MongoDB 可以处理的文档组成:
val result = collection.insertMany(paintOrders) try { println("Inserted documents with the following ids: ${result.insertedIds}") } catch(e: MongoBulkWriteException){ val insertedIds = e.writeResult.inserts.map { it.id.asInt32().value } println( "A MongoBulkWriteException occurred, but there are " + "successfully processed documents with the following ids: $insertedIds" ) collection.find().collect { println(it) } }
A MongoBulkWriteException occurred, but there are successfully processed documents with the following ids: [60930c3aa982931c20ef6cd7, 644ad1378ea29443837a14e9, 60930c3aa982931c20ef6cd8]
如果您查看集合内部,应该会看到以下文档:
{ "color": "red", "qty": 5 } { "color": "purple", "qty": 10 }
成功插入后,该方法会返回一个InsertManyResult
实例,表示每个新文档的_id
。
例子
以下示例创建两个文档并将其添加到List
中,并使用insertMany()
方法插入List
:
val paintOrders = listOf( PaintOrder(ObjectId(), 5, "red"), PaintOrder(ObjectId(), 10, "purple") ) val result = collection.insertMany(paintOrders) println("Inserted a document with the following ids: ${result.insertedIds.toList()}")
Inserted documents with the following ids: [60930c3aa982931c20ef6cd7, 60930c3aa982931c20ef6cd8]
有关部分提及的方法和类的更多信息,请参阅以下资源:
insertMany() API 文档
InsertManyResult API 文档
insertMany()手册解释
可运行的插入多个文档示例
总结
可以通过三种方法执行插入操作,但我们重点介绍两种:
insertOne()
方法插入单个文档。insertMany()
方法插入多个文档。
如果在文档中省略该字段,这两种方法都会自动生成_id
。
如果插入成功,这两个方法都会返回一个表示每个新文档的_id
的实例。