在MongoDB中,如何根据一个字符串字段是否包含另一个字符串来执行查询

时间:2016-12-05 22:53:39

标签: javascript mongodb

您好,请帮帮我。 在mongodb,我有一个这样的集合:

data1= {
    "string1":"abc",
    "string2":"abcde"
}

data2= {
    "string1":"abc",
    "string2":"ftgr"
}

在查询之后我只想返回data1,因为它的string2属性包含它的string1属性的内容。我怎样才能做到这一点?我应该使用$ where还是使用正则表达式?如果有人可以指出小费,非常感谢。

1 个答案:

答案 0 :(得分:2)

您可以install.packages("data.table") library(data.table) a <- c(rep("A", 3), rep("B", 3), rep("C",2)) b <- c(1,1,2,4,1,1,2,2) dt <-data.table(a,b) >dt a b 1: A 1 2: A 1 3: A 2 4: B 4 5: B 1 6: B 1 7: C 2 8: C 2 >unique(dt,by="a") a b 1: A 1 2: B 4 3: C 2 $where创建RegExp,然后针对string1对其进行测试,从而对string2执行此操作:

db.test.find({$where: 'RegExp(this.string1).test(this.string2)'})

但是,如果您使用的是MongoDB 3.4+,则可以使用$indexOfCP聚合运算符更有效地执行此操作:

db.test.aggregate([
    // Project  the index of where string1 appears in string2, along with the original doc.
    {$project: {foundIndex: {$indexOfCP: ['$string2', '$string1']}, doc: '$$ROOT'}},
    // Filter out the docs where the string wasn't found
    {$match: {foundIndex: {$ne: -1}}},
    // Promote the original doc back to the root
    {$replaceRoot: {newRoot: '$doc'}}
])

或者更直接地使用$redact

db.test.aggregate([
    {$redact: {
        $cond: {
            if: { $eq: [{$indexOfCP: ['$string2', '$string1']}, -1]},
            then: '$$PRUNE',
            else: '$$KEEP'
        }
    }}
])