Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 结合$text搜索和$regex的Mongodb查询_Javascript_Mongodb_Mongoose_Nosql - Fatal编程技术网

Javascript 结合$text搜索和$regex的Mongodb查询

Javascript 结合$text搜索和$regex的Mongodb查询,javascript,mongodb,mongoose,nosql,Javascript,Mongodb,Mongoose,Nosql,我的困境是mongodb$text搜索必须匹配准确的单词:例如,如果试图将帖子与'testing123'匹配,则对'test'的搜索将不匹配,但使用$regex将匹配。现在,我也想利用索引,但我也想要部分匹配 我的想法是,我可以将它们与$或操作符组合,但它不起作用。这可能吗?$或中的每个查询单独起作用,但是当组合它们时,我没有得到匹配项 如果这是不可能的,我已经找到了一个很好的解决方案,但是如果可能的话,我希望组合的$或能够工作,但是欢迎任何其他建议 const posts = await Po

我的困境是mongodb
$text
搜索必须匹配准确的单词:例如,如果试图将帖子与'testing123'匹配,则对'test'的搜索将不匹配,但使用
$regex
将匹配。现在,我也想利用索引,但我也想要部分匹配

我的想法是,我可以将它们与
$或
操作符组合,但它不起作用。这可能吗?
$或
中的每个查询单独起作用,但是当组合它们时,我没有得到匹配项

如果这是不可能的,我已经找到了一个很好的解决方案,但是如果可能的话,我希望组合的
$或
能够工作,但是欢迎任何其他建议

const posts = await Post.find({
  name: { $regex: 'foo', $options: 'i' },
  $or: [
    { $text: { $search: text, $caseSensitive: false } },
    { text: { $regex: text, $options: 'i' } },
  ],
});

一种方法是将文本降格到另一个字段中,然后在该字段上使用$regex搜索


您有要不敏感地搜索任何子字符串大小写的文本:

MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.insert({foo:'hello world TESTING123'})
WriteResult({ "nInserted" : 1 })
步骤1:添加另一个以小写形式存储文本的字段

MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.insert({foo:'hello world TESTING123',foo_lower:'hello world testing123'})
步骤2:添加索引

MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.createIndex({foo_lower:1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 2,
    "numIndexesAfter" : 3,
    "commitQuorum" : "votingMembers",
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1597711723, 7),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1597711723, 7)
}
步骤3:将查询降级为“testing123”

步骤4:使用$regex

MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.find({foo_lower:{$regex:'testing123'}})
{ "_id" : ObjectId("5f3b2498f885e53d90f30979"), "foo" : "hello world TESTING123", "foo_lower" : "hello world testing123" }
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.find({foo_lower:{$regex:'testing123'}}).explain()
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.foo",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "foo_lower" : {
                "$regex" : "testing123"
            }
        },
        "queryHash" : "0D14CC56",
        "planCacheKey" : "1974A2D4",
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "filter" : {
                    "foo_lower" : {
                        "$regex" : "testing123"
                    }
                },
                "keyPattern" : {
                    "foo_lower" : 1
                },
                "indexName" : "foo_lower_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "foo_lower" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "foo_lower" : [
                        "[\"\", {})",
                        "[/testing123/, /testing123/]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "serene",
        "port" : 14420,
        "version" : "4.4.0",
        "gitVersion" : "563487e100c4215e2dce98d0af2a6a5a2d67c5cf"
    },
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1597711761, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1597711761, 1)
}

你能给我一个小例子说明你的意思吗?不区分大小写的regexp匹配不支持索引,因此,您可以创建另一个字段,在该字段中,文本被下格,您可以以区分大小写的方式进行搜索。这将如何解决部分搜索的问题?部分搜索确切的单词意味着什么?如果我试图匹配一篇包含testing123的文章,而我只搜索test,则$text$搜索将不匹配,但使用$regex将匹配。这就是为什么我想把两者结合起来。