Различное поведение в проекции запроса mongodb с использованием асинхронного режима

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

    [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
}

person Aaron Newman    schedule 02.09.2016    source источник


Ответы (1)


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

query = query.Project(metaDoc);
person Craig Wilson    schedule 02.09.2016
comment
Я думал о сборе параметров SQL, но этот интерфейс работает иначе. Я не был знаком с концепцией беглых утверждений, но думаю, что это важно... спасибо! - person Aaron Newman; 03.09.2016