2016-09-08 3 views
-2

Мне нужно выполнить следующий запрос MongoDB с использованием драйвера C# для выполнения функции javascript в поле типа «Код» и проверить данные внутри содержит guid в виде строки:

запрос MongoDB, который работает следующим образом:

db.getCollection('BackgroundTasks').find({ Status: 1, $where: function() { 
     if (this.Settings.hasOwnProperty("ID")){ 
      return this.Settings.ID== "606d7afb-3dce-4533-8f8d-6411715e5b47"; 
     }   
     return false; 
    } 
}) 

Нужна C# версии кода с помощью строителей фильтра из нового API.

+0

Hi Dio, Добро пожаловать в Stack Overflow! Можете ли вы показать нам, что вы пробовали до сих пор, и в какой степени это сработало или нет? Помните, вам рекомендуется редактировать и повторно редактировать свой вопрос, чтобы сделать его максимально понятным и полезным. –

ответ

0

Решение, которое работало для меня:

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(); 
0

Вы могли бы добиться этого с помощью строителей и LINQ, если вы сильно типизированных, в противном случае вы можете использовать одни и те же строители, но предоставить текст вместо того, чтобы (они оценили из ниже строго типизированные запросы). Вы можете заменить яваскрипт функцию с $ существует фильтр, и вы можете заменить $ или $ в

Нечто подобное должен работать для вас

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();