大家好,我们可以在mongodb做这样的事吗
col1 + col2,如'%test%'
因为我必须在具有架构的集合中搜索测试的存在
collection = { "col1" : "sds" , "col2" : "est" , "col3" : ""}
答案 0 :(得分:1)
尝试
db.collection.find( { $where: "/^.*test.*$/.test(this.col1 + this.col2)" } );
在这种情况下,正则表达式/test/
也应该起作用。
当然,mongo必须对所有文档进行全面扫描,因为没有选项可以使用索引。
答案 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”