MongoDB字段值比较:如何在$where查询中使用正则(含C#实现)
在MongoDB中使用$where实现字段间正则匹配及C#实现
嘿,我来帮你搞定这个问题!你已经知道用$where做字段等值比较了,要实现类似“字段间正则匹配”的效果,核心是在$where的JavaScript逻辑里利用正则表达式的方法,下面分两种常见场景说明:
MongoDB Shell 写法
场景1:检查field2的值是否包含field1的内容(类似SQL的 field2 LIKE '%' || field1 || '%')
如果你的需求是判断field2里包含field1的内容,可以用String.includes()或者正则的test()方法:
db.collection.find({ $where: "this.field2.includes(this.field1)" })
要是需要忽略大小写这类额外规则,用正则会更灵活:
db.collection.find({ $where: "new RegExp(this.field1, 'i').test(this.field2)" })
场景2:用field1的值作为正则表达式匹配field2
如果field1本身就是一个正则模式字符串(比如"foo.*"),要匹配field2的值,可以直接构造RegExp对象:
db.collection.find({ $where: "new RegExp(this.field1).test(this.field2)" })
注意:
$where会逐文档执行JavaScript代码,无法利用索引,在数据量较大的集合上查询性能会很差,非必要不建议使用。如果能通过普通查询操作符组合实现需求,优先用后者。
C# 对应实现
在C#的MongoDB驱动中,你需要用BsonJavaScript来封装$where的逻辑,下面是对应上面场景的代码:
场景1:field2包含field1(忽略大小写)
var filter = new BsonDocument("$where", new BsonJavaScript("new RegExp(this.field1, 'i').test(this.field2)")); var result = collection.Find(filter).ToList();
场景2:用field1作为正则匹配field2
var filter = new BsonDocument("$where", new BsonJavaScript("new RegExp(this.field1).test(this.field2)")); var result = collection.Find(filter).ToList();
如果你的需求是field1匹配field2的内容(和场景1反过来),只需要调换字段位置即可:
var filter = new BsonDocument("$where", new BsonJavaScript("new RegExp(this.field2).test(this.field1)"));
内容的提问来源于stack exchange,提问作者Mehrdad
相关产品推荐
相关产品推荐

