使用Filter查找$ where for MongoDb C#驱动程序新版本

时间:2016-09-08 07:09:05

标签: c# mongodb mongodb-csharp-2.0

我需要使用C#驱动程序执行以下MongoDB查询,以在“代码”类型的字段上执行javascript函数,并检查内部包含guid asa字符串的数据:

有效的mongodb查询是:

MATCH (n:Actor) WHERE n.name CONTAINS "Tom"
USING INDEX n:Actor(name)
RETURN n

需要使用来自新API的Builders过滤器的C#版代码。

2 个答案:

答案 0 :(得分:1)

对我有用的解决方案:

var collection = _database.GetCollection<BsonDocument>("BackgroundTasks");
var jsFilter = new BsonDocument(new BsonDocument("$where", new BsonJavaScript("function() { if (this.Settings.hasOwnProperty('TranslationMemoryId')){return this.Settings.TranslationMemoryId == '"+tmid.ToString()+"';}return false; }")));
var filter = jsFilter & (Builders<BsonDocument>.Filter.Eq("Status", 3) | Builders<BsonDocument>.Filter.Eq("Status", 4));
var results = collection.Find(filter).ToList();

答案 1 :(得分:0)

如果你是强类型的,你可以使用构建器和linq实现这一点,否则你可以使用相同的构建器但是提供文本(这些在强类型查询下面被推荐)。您可以使用$ exists过滤器替换您的javascript函数,并且可以将$或$ in替换为

这样的事情对你有用

var builder = Builders<YourModel>.Filter;

var fieldExists = builder.Exists(x => x.Settings.TranslationMemoryId);
//var fieldExists = builder.Exists("TranslationMemoryId");
var statusFilter = builder.In(x => x.Status, new[] { 3, 4 });
//var statusFilter = builder.In("Status", new[] { 3, 4 });
var transIdFilter = builder.Eq(x => x.TranslationMemoryId, "606d7afb-3dce-4533-8f8d-6411715e5b47");
//var transIdFilter = builder.Eq("TranslationMemoryId", "606d7afb-3dce-4533-8f8d-6411715e5b47");

var query = builder.And(builder.And(fieldExists, transIdFilter), statusFilter);

var results = db.getCollection("BackgroundTasks")
    .Find(query)
    .ToList();