Reputation: 3373
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"
}
]
Upvotes: 11
Views: 33703
Reputation: 164
The best method for me that woks with no warning is from mongodb could
and from code you need to pass :>>
const blogPosts = await BlogPostModel.find({ $text: { $search: `"${req.query["your-search-query"] }"` } })
Upvotes: 4
Reputation: 587
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
Upvotes: 5
Reputation: 49945
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();
Upvotes: 9