Bulk writes
This guide covers common patterns for bulk writes in FQL. You use bulk writes to create, update, or delete multiple collection documents in a single query.
Import documents from a CSV or JSON
You can use the Fauna CLI's
fauna import
command to import collection
documents from a CSV or JSON file:
fauna import --path=./customers.json --collection=Customer
Reference: fauna import |
---|
Create multiple documents
Use the array.forEach()
and
collection.create()
to create a collection document for each element of an object Array:
// Create an Array of objects that contain document data.
let customers = [
{
"name": "Ruby Von Rails",
"email": "ruby@example.com",
"address": {
"street": "87856 Mendota Court",
"city": "Washington",
"state": "DC",
"postalCode": "20220",
"country": "US"
}
},
{
"name": "Scott Chegg",
"email": "chegg@example.com",
"address": {
"street": "87856 Mendota Court",
"city": "Washington",
"state": "DC",
"postalCode": "20220",
"country": "US"
}
},
{
"name": "Hilary Ouse",
"email": "ouse@example.com",
"address": {
"street": "87856 Mendota Court",
"city": "Washington",
"state": "DC",
"postalCode": "20220",
"country": "US"
}
}
]
// Use `forEach()` to create a `Customer` collection document for each
// element of the previous Array.
customers.forEach(doc => Customer.create({ doc }))
// `forEach()` returns `null`.
Reference: array.forEach() ,
collection.create() |
---|
Edit multiple documents
Use set.forEach()
and
document.update()
to iteratively update each document in a Set:
// Get a Set of `Customer` collection documents with an
// `address` in the `state` of `DC`.
let customers = Customer.where( .address?.state == "DC" )
// Use `forEach()` to update each document in the previous Set.
customers.forEach(doc => doc.update({
address: {
street: doc?.address?.street,
city: doc?.address?.city,
state: "District of Columbia",
postalCode: doc?.address?.postalCode,
country: doc?.address?.country,
}
})) // `forEach()` returns `null`.
Reference: set.forEach() ,
document.update() |
---|
Upsert multiple documents
Use an if... else
expression to upsert
documents. An upsert conditionally:
-
Creates a document if a document with the specified key doesn’t exist.
-
Updates an existing document if a document with the key already exists.
The following query uses an if... else
expression with array.forEach()
,
collection.create()
, and
document.update()
.
// Create an Array of customer data to upsert.
let customersToUpsert = [
{
"name": "Ruby Von Rails",
"email": "ruby@example.com",
"address": {
"street": "123 Coding Lane",
"city": "Programmington",
"state": "CA",
"postalCode": "90210",
"country": "US"
}
},
{
"name": "Scott Chegg",
"email": "chegg@example.com",
"address": {
"street": "456 Database Drive",
"city": "Queryville",
"state": "NY",
"postalCode": "10001",
"country": "US"
}
},
{
"name": "Hilary Ouse",
"email": "ouse@example.com",
"address": {
"street": "789 Algorithm Avenue",
"city": "Looptown",
"state": "TX",
"postalCode": "75001",
"country": "US"
}
}
]
// Define a function to upsert each customer.
let upsertCustomer = (customerData) => {
// Get each existing customer's by their email address.
// The `Customer` collection contains a unique constraint
// that enforces unique `email` field values.
let existingCustomer = Customer.byEmail(customerData.email).first()
if (existingCustomer == null) {
// Create a new customer if not found.
Customer.create(customerData)
} else {
// If found, update the existing customer.
existingCustomer!.update(customerData)
}
}
// Use `forEach()` to update each document in the previous Set.
customersToUpsert.forEach(customer => upsertCustomer(customer))
// `forEach()` returns `null`.
Reference: set.forEach() ,
collection.create() ,
document.update() |
---|
Delete multiple documents
Use set.forEach()
and
document.delete()
to iteratively delete documents in a Set:
// Get a Set of `Customer` collection documents with an
// `address` in the `state` of `DC`.
let customers = Customer.where( .address?.state == "DC" )
// Use `forEach()` to delete each document in the previous Set.
customers.forEach(doc => doc.delete())
// `forEach()` returns `null`.
Reference: set.forEach() ,
document.delete() |
---|
Paginate bulk writes
Queries are subject to size limits.
If you’re performing bulk writes on a large dataset, you can use
set.pageSize()
and
set.paginate()
to perform the
write over several queries instead of one.
// Get a Set of `Customer` collection documents with an
// `address` in the `state` of `DC`. Use `pageSize()`
// and`paginate()` to paginate results and
// limit each page to two documents.
let page = Customer.where( .address?.state == "DC" )
.pageSize(2).paginate()
// `paginate()` returns an object. The object's `data` property
// contains an Array of `Customer` documents.
let data = page.data
// Use `forEach()` to update each `Customer` document in the
// `data` Array.
data.forEach(doc => doc.update({
address: {
street: doc?.address?.street,
city: doc?.address?.city,
state: "District of Columbia",
postalCode: doc?.address?.postalCode,
country: doc?.address?.country,
}
}))
// Project the `after` cursor returned by `paginate()`.
// You can use the cursor to iterate through the remaining
// pages.
page {
after
}
The query returns an after
cursor:
{
after: "hdWDxoq..."
}
Subsequent queries use the cursor and
Set.paginate()
to iterate
through the remaining pages:
// Uses `Set.paginate()` to iterate through pages.
let page = Set.paginate("hdWDxoq...")
let data = page.data
data.forEach(doc => doc.update({
address: {
street: doc?.address?.street,
city: doc?.address?.city,
state: "District of Columbia",
postalCode: doc?.address?.postalCode,
country: doc?.address?.country,
}
}))
page {
after
}
See Pagination |
---|
Is this article helpful?
Tell Fauna how the article can be improved:
Visit Fauna's forums
or email docs@fauna.com
Thank you for your feedback!