mongoose: 5.8.9
node: v12.13.0
After setting up to create index on the schema, mongoose doesn't create the index, After creating a new document there is only ID index nothing newly created. I had done as the document mentioned for creating index but still I can't figure out where I'm making the mistake.
When
const ads = await Ad.find({ $text: { $search: "something" } })
Error
MongoError: text index required for $text query
at Connection.<anonymous> (/home/usama/Projects/commercial/adex/node_modules/mongoose/node_modules/mongodb/lib/core/connection/pool.js:466:61)
at Connection.emit (events.js:210:5)
at Connection.EventEmitter.emit (domain.js:476:20)
at processMessage (/home/usama/Projects/commercial/adex/node_modules/mongoose/node_modules/mongodb/lib/core/connection/connection.js:384:10)
at Socket.<anonymous> (/home/usama/Projects/commercial/adex/node_modules/mongoose/node_modules/mongodb/lib/core/connection/connection.js:553:15)
at Socket.emit (events.js:210:5)
at Socket.EventEmitter.emit (domain.js:476:20)
at addChunk (_stream_readable.js:308:12)
at readableAddChunk (_stream_readable.js:289:11)
at Socket.Readable.push (_stream_readable.js:223:10)
at TCP.onStreamRead (internal/stream_base_commons.js:182:23) {
ok: 0,
errmsg: 'text index required for $text query',
code: 27,
codeName: 'IndexNotFound',
name: 'MongoError',
[Symbol(mongoErrorContextSymbol)]: {}
}
My schema
import { Schema } from 'mongoose'
import mongoosePaginate from 'mongoose-paginate-v2'
import Local from '../index'
const adSchema = new Schema(
{
id: Schema.Types.ObjectId,
creater: Schema.Types.ObjectId,
title: { type: String },
tags: Array,
description: { type: String, maxlength: 4500, },
},
{
timestamps: true,
versionKey: false,
autoIndex: false
}
)
adSchema.index({ title: 'text', description: 'text', tags: 'text' })
adSchema.plugin(mongoosePaginate)
const Ad = Local.model('Ad', adSchema)
export { Ad as default }
On mongo shell
> myads.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "adex.ads"
}
]
In MongoDB, we can create text indexes using db. collectionName. createIndex() method. So, to index a field that contains either string or an array of string elements, pass a document in the createIndex() method that contains the field and the string literal(i.e., “text”).
One Text Index Per Collection A collection can have at most one text index.
Indexes are defined through ensureIndex every time a model is compiled for a certain connection / database. This means that indexes will only be ensured once during the lifetime of your app.
A Mongoose schema defines the structure of the document, default values, validators, etc., whereas a Mongoose model provides an interface to the database for creating, querying, updating, deleting records, etc.
Below line:
adSchema.index({ title: 'text', description: 'text', tags: 'text' })
correctly defines an index on mongoose schema (not on a database). By default mongoose creates indexes when your application starts up (link) however you're preventing it by using autoIndex: false
.
So you have to either remove that line or run createIndexes
on your model explicitly:
adSchema.index({ title: 'text', description: 'text', tags: 'text' });
const Ad = Local.model('Ad', adSchema);
Ad.createIndexes();
This is how you resolve the same using MongoDB Compass application instead using the mongo console.
Connect to the DB using a connection string like this
mongodb://<user>:<password>@<ip>:<port>/<your db>?authSource=<user>&readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false
Then select the correct collection
from the left pane and then select Indexes
tab and create the text index like shown below
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With