2016-01-30 2 views
2

Я пытаюсь написать код, который находит объекты в коллекции MongoDB с Linq. Вот мой код:Поиск суб-объекта в коллекции MongoDB с использованием LINQ/C#

class Program 
{ 
    static void Main(string[] args) 
    { 
     var client = new MongoClient(); 
     var db = client.GetDatabase("SoundsDB"); 
     var collection = db.GetCollection<Sound>("SoundsCollection"); 
     string myID = "0vvyXSoSHI"; 

     var myObjects = collection 
      .Find(b => b.objectId == myID); 

    } 
} 

public class Sound 
{ 
    public string _id { get; set; } 
    public Result[] results { get; set; } 
} 

public class Result 
{ 
    public Audio_File audio_file { get; set; } 
    public DateTime createdAt { get; set; } 
    public string location { get; set; } 
    public string objectId { get; set; } 
    public DateTime updatedAt { get; set; } 
} 

public class Audio_File 
{ 
    public string __type { get; set; } 
    public string name { get; set; } 
    public string url { get; set; } 
} 

Вот JSON в моей коллекции MongoDB:

{ 
"_id" : ObjectId("56acced71b8ac8702446e8c6"), 
"results" : [ 
    { 
     "audio_file" : { 
      "__type" : "File", 
      "name" : "tfss-3c489351-0338-4903-8d94-a0f0c7091ef9-hi.m4a", 
      "url" : "http://files.parsetfss.com/hithere.m4a" 
     }, 
     "createdAt" : "2014-12-27T22:59:04.349Z", 
     "location" : "Home", 
     "objectId" : "0vvyXSoSHI", 
     "updatedAt" : "2015-02-26T22:48:02.264Z" 
    } 
     ] 

}

Я пытаюсь заставить его работать, но в следующей строке:

   .Find(b => b.objectId == myID) 

Я получаю эту ошибку: Невозможно преобразовать lambda expre ssion, чтобы напечатать «MongoDB.Driver.FilterDefinition», потому что он не является типом делегата

Любая идея, как я могу его исправить и уметь искать через объекты JSON с помощью объекта objectId? Спасибо!

ответ

1

Я думаю, проблема в том, что вы ищете суб-документ, а не основной документ. Попробуйте следующее:

var myObjects = collection 
    .Find(b => b.results.Any(r=>r.objectId == myID)); 

Также - убедитесь, что значение objectId на самом деле является строкой в ​​вашей коллекции. Кажется, что это строка в объектной модели, но objectId в db. Возможно, вам понадобится (а) изменить модель объекта и (б) изменить этот запрос, чтобы вы запрашивали r.objectId == ObjectId.Parse(myID) вместо того, как я его написал.

C# MongoDb .find является асинхронным

Если вы используете драйверы C#, вы, вероятно, также необходимо реализовать асинхр для этого вызова:

static void Main() { 
    MainAsync().Wait(); 
} 

static async Task MainAsync() { 

    var client = new MongoClient(); 
    var db = client.GetDatabase("SoundsDB"); 
    var collection = db.GetCollection<Sound>("SoundsCollection"); 
    string myID = "0vvyXSoSHI"; 

    var myObjects = await collection 
     .Find(b => b.objectId == myID).ToListAsync(); 

} 

Таким образом, вы используете находку , и преобразование результатов в список (так что myObjects будет List<SoundsCollection>).

+0

Хм, просто проверил его, и это строка в БД .. Я запустил код, который вы написали, и я думаю, что он работает успешно, но я не уверен, так как я не вижу никаких данных внутри этого объекта. –

+0

Если вы используете последние mongodb драйвер (ы), то это все async. См. Обновления ответа. – bri

+0

Не уверен, что я тебя понял .. Как мне это сделать асинхронно? –