猫鼬 $search 返回空数组
Mongoose $search returning empty array
在 mongoose 中使用 $search
时得到一个空数组。
架构
const mongoose = require('mongoose');
const studentSchema = new mongoose.Schema({
name: { type: String },
});
studentSchema.index({ name: 'text' });
const Student = mongoose.model('Student', studentSchema);
module.exports = Student;
$search
const Student = require('../models/Student.Model');
(async () => {
const result = await Student.aggregate([
{
$search: {
index: 'default',
compound: {
must: [
{
text: {
query: 'Lee',
path: 'name',
fuzzy: {
maxEdits: 1,
},
},
},
],
},
},
},
]);
})();
这给了我一个空数组。所以我尝试了另一种语法。
const result = await Student.aggregate().search({
index: 'default',
compound: {
must: [
{
text: {
query: 'Lee',
path: 'name',
fuzzy: {
maxEdits: 1,
},
},
},
],
},
});
这也给了我一个空数组。
为了测试模型是否有效,我使用了 find
和 filter
,并且可以看到与 $search
.
期望的类似结果
let result2 = await Student.find({});
result2 = result2.filter((p) => p.name.includes('Lee'));
result2
有两个文档
result2: [
{ _id: 625f70ac90e916620045cab5, name: 'Brian Lee', __v: 0 },
{ _id: 625f70e39660b486c82b2011, name: 'Lee Cohen', __v: 0 }
]
更新:find
和 $text
也给了我上面的正确结果,但我想实现模糊搜索,我认为你不能用 find
和 $文本`:
const resultsShort = await Student.find({ $text: { $search: 'Lee' } });
为什么 $search
不返回这两个文档?
使用$regex
db.collection.find({
name: {
$regex: "Lee"
}
})
创建索引
db.collection.createIndex({name:"text"})
文本搜索
db.collection.find({$text: {$search: "Lee"}})
这会创建 $text 索引而不是 Atlas Search 索引:
studentSchema.index({ name: 'text' });
以上可以去掉
您不能在猫鼬模式上创建 Atlas 搜索索引,它必须在 Atlas 站点或 CLI 上设置。
要创建 Atlas 搜索索引,请转到您的数据库 cloud.mongodb.com ->搜索-->创建搜索索引-->JSON编辑器-->下一步-->选择你的collection-->设置索引名称。这里是 'default'
然后设置索引:
{
"mappings": {
"dynamic":false,
"fields":{
"name":{
"analyzer":"lucene.standard",
"type":"string"
}
}
}
那么这段代码就可以了。
const result = await Student.aggregate().search({
index: 'default',
compound: {
must: [
{
text: {
query: 'Lee',
path: 'name',
fuzzy: {
maxEdits: 1,
},
},
},
],
},
});
```
在 mongoose 中使用 $search
时得到一个空数组。
架构
const mongoose = require('mongoose');
const studentSchema = new mongoose.Schema({
name: { type: String },
});
studentSchema.index({ name: 'text' });
const Student = mongoose.model('Student', studentSchema);
module.exports = Student;
$search
const Student = require('../models/Student.Model');
(async () => {
const result = await Student.aggregate([
{
$search: {
index: 'default',
compound: {
must: [
{
text: {
query: 'Lee',
path: 'name',
fuzzy: {
maxEdits: 1,
},
},
},
],
},
},
},
]);
})();
这给了我一个空数组。所以我尝试了另一种语法。
const result = await Student.aggregate().search({
index: 'default',
compound: {
must: [
{
text: {
query: 'Lee',
path: 'name',
fuzzy: {
maxEdits: 1,
},
},
},
],
},
});
这也给了我一个空数组。
为了测试模型是否有效,我使用了 find
和 filter
,并且可以看到与 $search
.
let result2 = await Student.find({});
result2 = result2.filter((p) => p.name.includes('Lee'));
result2
有两个文档
result2: [
{ _id: 625f70ac90e916620045cab5, name: 'Brian Lee', __v: 0 },
{ _id: 625f70e39660b486c82b2011, name: 'Lee Cohen', __v: 0 }
]
更新:find
和 $text
也给了我上面的正确结果,但我想实现模糊搜索,我认为你不能用 find
和 $文本`:
const resultsShort = await Student.find({ $text: { $search: 'Lee' } });
为什么 $search
不返回这两个文档?
使用$regex
db.collection.find({
name: {
$regex: "Lee"
}
})
创建索引
db.collection.createIndex({name:"text"})
文本搜索
db.collection.find({$text: {$search: "Lee"}})
这会创建 $text 索引而不是 Atlas Search 索引:
studentSchema.index({ name: 'text' });
以上可以去掉
您不能在猫鼬模式上创建 Atlas 搜索索引,它必须在 Atlas 站点或 CLI 上设置。
要创建 Atlas 搜索索引,请转到您的数据库 cloud.mongodb.com ->搜索-->创建搜索索引-->JSON编辑器-->下一步-->选择你的collection-->设置索引名称。这里是 'default'
然后设置索引:
{
"mappings": {
"dynamic":false,
"fields":{
"name":{
"analyzer":"lucene.standard",
"type":"string"
}
}
}
那么这段代码就可以了。
const result = await Student.aggregate().search({
index: 'default',
compound: {
must: [
{
text: {
query: 'Lee',
path: 'name',
fuzzy: {
maxEdits: 1,
},
},
},
],
},
});
```