2016-09-02 9 views
0

Я реализую метод поиска в C#. Проблема в том, что метаданные оценки не включаются в результат, вызывая его исключение в последней строке. Это похоже на то, что поиск выполняется без предложения проекта. Я использую версию 2.2.4.26 драйвера C#.Различное поведение в прогнозе запросов mongodb с использованием async

[HttpPost] public async Task<JsonResult> SearchPost(string str) 
    { 
     _client = new MongoClient("mongodb://localhost:27017"); 
     _database = _client.GetDatabase("test"); 
     IMongoCollection<BsonDocument> collection = _database.GetCollection<BsonDocument>("test"); 

     MongoDB.Bson.BsonDocument searchDoc 
      = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(
       "{$text:{$search:'" + str + "'}}"); 
     MongoDB.Bson.BsonDocument metaDoc 
      = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(
       "{score: {$meta: 'textScore'}}"); 

     IFindFluent<BsonDocument, BsonDocument> query = collection.Find(searchDoc); 
     query.Project(metaDoc); 

     List<BsonDocument> col = await query.ToListAsync(); 
     foreach (BsonDocument doc in col) 
     { 
      jsonResult = doc.ToJson(); 
      double score = doc.FirstOrDefault(x => x.Name == "score").Value.AsDouble; 

Если я установить запрос на этом пути, который кажется мне синтаксический эквивалентом, я получаю результат оценки обратно:

List<BsonDocument> col = await collection.Find(searchDoc).Project(metaDoc).ToListAsync(); 

Правильный результат выглядит следующим образом:

{ 
    "_id" : "41608a74-8434-45e4-8404-99922f761dae", 
    "Path" : "C:\\src\\ba\\mongo\\samples\\xml\\item_20081_v11", 
    "Files" : [ 
     "content_en-us.xml", 
     "content_es-mx.xml", 
     "metadata.xml", 
     "rubric.xml", 
     "template.xml", 
     "translation_en-us.xml", 
     "translation_es-mx.xml" 
    ], 
    "ItemXml" : "....be used as a Paramecium cell membrane ...", 
    "score" : 1.58333333333333 
} 

ответ

1

Вам нужно присвоить результат query.Project (metaDoc) обратно к запросу. Точно так же, как LINQ, интерфейс IFindFluent неизменен.

query = query.Project(metaDoc); 
+0

Я думал, как набор параметров SQL, но это не так, как работает этот интерфейс. Я не был знаком с концепцией Свободных Утверждений, но я думаю, что это вещь ... спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^