Skip to content
KeystoneJS LogoKeystoneJSv5

MongoId

This field allows arbitrary MongoID fields to be added to your lists.

It supports the core Mongoose and Knex adapters:

  • On Mongoose the native Mongo ObjectId schema type is used.
  • On Knex a 24 character string field is added to the schema. This resolves down to varchar(24), character varying(24) or similar, depending on the underlying DB platform. Values stored are forced to lowercase on read and write to avoid issues with case-sensitive string comparisons. See the casing section for details.

Usage

const { Keystone } = require('@keystonejs/keystone');
const { MongoId } = require('@keystonejs/fields-mongoid');

const keystone = new Keystone(/* ... */);

keystone.createList('Product', {
  fields: {
    name: { type: Text },
    oldId: { type: MongoId },
    // ...
  },
});

Config

OptionTypeDefaultDescription
isRequiredBooleanfalseDoes this field require a value?
isUniqueBooleanfalseAdds a unique index that allows only unique values to be stored

Admin UI

We reuse the interface implementation from the native Text field.

GraphQL

MongoId fields use the ID type in GraphQL.

Input Fields

Field nameTypeDescription
${path}IDThe ID in it's 24 char hex representation

Output Fields

Field nameTypeDescription
${path}IDThe ID in it's 24 char hex representation

Filters

Since MongoId fields encode identifiers, "text" filters (eg. contains, starts_with, etc) are not supported. Note also that hexadecimal encoding, as used here, is case agnostic. As such, despite the GraphQL ID type being encoded as Strings, all MongoId filters are effectively case insensitive. See the the Casing section.

Field nameTypeDescription
${path}IDExact match to the ID provided
${path}_notIDNot an exact match to the ID provided
${path}_in[ID]In the array of IDs provided
${path}_not_in[ID]Not in the array of IDs provided

Storage

Mongoose Adaptor

The Mongoose Adaptor uses the native Mongo ObjectId schema type. Internally, the 12-byte value are stored in a binary format. Mongoose automatically and transparently converts to and from the 24 char hexadecimal representation when reading and writing.

Knex Adaptor

The Knex adaptor adds 24 character string field to the schema. This resolves down to varchar(24), character varying(24) or similar, depending on the underlying DB platform.

Values stored are forced to lowercase on read and write to avoid issues with case-sensitive string comparisons. See the casing section for details.

The field adapter supplied for Knex supports the isNotNullable and defaultTo options.

Casing

Mongo ObjectIDs are usually passed around in a hexadecimal string representation. Hexadecimal itself is case agnostic; the hex value AF3D is identical to the hex value af3d (they encode the same value as decimal 44861 or binary 1010111100111101). However, JavaScript and (depending on your configuration) some DB platforms are case-sensitive; in these contexts, the string 'AF3D' does not equal the string 'af3d'.

For the MongoId type, we mitigate this problem by forcing values to lowercase when using the Knex adapter.

Similar issues are faced by the core Uuid field type. It is also often represented using hexadecimal within a string.

Have you found a mistake, something that is missing, or could be improved on this page? Please edit the Markdown file on GitHub and submit a PR with your changes.

Edit Page