Mongodb col1 + col2就像'%test%'

时间:2014-02-12 07:34:37

标签: mongodb mongodb-query aggregation-framework

大家好,我们可以在mongodb做这样的事吗

  

col1 + col2,如'%test%'

因为我必须在具有架构的集合中搜索测试的存在

collection = { "col1" : "sds" , "col2" : "est" , "col3" : ""}

2 个答案:

答案 0 :(得分:1)

尝试

db.collection.find( { $where: "/^.*test.*$/.test(this.col1 + this.col2)" } );

在这种情况下,正则表达式/test/也应该起作用。

当然,mongo必须对所有文档进行全面扫描,因为没有选项可以使用索引。

MongoDB doc $where

答案 1 :(得分:1)

如果你想要连接:

如果你试图连接并且仍然想要使用一个索引,你可能至少要找到“col1”和“col2”存在的位置,因为试图连接不存在的东西最终会变得可怕错误。

考虑一下这个集合,因为连接将匹配test:

{ col1: "sdst", col2: "est", col3: "abc"}

$concat中使用$regex运算符和$match聚合:

db.test.aggregate([
    // Find the rows you can concatenate -- uses index
    {$match: { col1: {$exists: true}, col2: {$exists: true}} },

    // Concatenate the strings and retain the original columns
    {$project:{
        col1: 1,
        col2: 1,
        col3: 1, 
        newcol: {$concat: [ "$col1", "$col2" ]}
    }},

    // Match the required strings in the concatenated result
    {$match: { newcol: {$regex: "test", $options: "i"} } },

    // Restore the original document fields only    
    {$project: { col1: 1, col2: 1, col3: 1 }
])

在初始匹配之后仍然无法使用索引,但它比$where更好,这将取消任何使用索引的机会。

如果您想在“col1”和“col2”中找到“test”,那么这很简单,只需在查询中使用$or即可查找。

db.test.find({ $or: [ { col1: "test" }, { col2: "test" } ] })

或$ regex如果你必须在字符串中找到它。请注意,如果您不从字符串的开头查看$ regex效率不高,如:“^ test”