Geoff Ball
Support Engineer at Sanity.io
Script to batch remove a field from all documents that match a GROQ query
/**
* THIS SCRIPT DELETES DATA!
*
* To use this script:
* 1. Put this script in your studio folder
* 2. Set FIELD_TO_REMOVE to the field you want to remove (using dot notation to drill down)
* 3. Optionally, modify the GROQ filter in fetchDocuments() to further restrict the query, if needed
* 4. Run `sanity dataset export` to backup your dataset before modifying a bunch of documents
* 5. Run `sanity exec removeField.js --with-user-token` in your terminal to delete the field from all matched documents
*/
import sanityClient from 'part:@sanity/base/client'
const client = sanityClient.withConfig({ apiVersion: '2021-12-17' })
const FIELD_TO_REMOVE = 'metadata.location'
const fetchDocuments = () => client.fetch(`*[${FIELD_TO_REMOVE} != null][0...10] {_id, _rev}`)
const buildPatches = docs => docs.map(doc => ({
id: doc._id,
patch: {
unset: [FIELD_TO_REMOVE],
ifRevisionID: doc._rev
}
}));
const createTransaction = patches =>
patches.reduce((tx, patch) => tx.patch(patch.id, patch.patch), client.transaction())
const commitTransaction = tx => tx.commit()
const editNextBatch = async () => {
const documents = await fetchDocuments()
const patches = buildPatches(documents)
if (patches.length === 0) {
console.log('No more documents to unset!')
return null
}
console.log(
`Editing batch:\n %s`,
patches.map(patch => `${patch.id} => ${JSON.stringify(patch.patch)}`).join('\n')
)
const transaction = createTransaction(patches)
await commitTransaction(transaction)
return editNextBatch()
}
editNextBatch().catch(err => {
console.error(err)
process.exit(1)
})
This script lets you unset/remove a field from documents that match a GROQ query. For example, this might be used to quickly remove sensitive data (in this code, we're removing metadata.location
).
It can be run from your terminal in a studio folder using sanity exec removeField.js --with-user-token
.
Note that this script deletes data so it is wise to export your dataset and/or test your script on a non-production dataset before running this in production.
Support Engineer at Sanity.io
Your block styles will normally look the same in the editor and the styles dropdown. For the times you don't want that, this workaround lets you configure them differently.
Go to Create different block styles for the dropdown and editorSometimes, you just need to migrate a document or two.
Go to Ad hoc document migrationGROQ doesn't yet include a function to match the end of a string, but we can simulate it by splitting our string on our term.
Go to Matching the end of a string in GROQSimplify your Studio experience by hiding deprecated fields when you create new documents.
Go to Hide a deprecated field in new documents