2011-01-27 2 views
3

Я некоторые 37K документы, хранящиеся в Монго, что похож на них:MongoDB и комплекс Массив Поиск

{ 
    "_id" : GUID, 
    "Country" : "Germany", 
    "TypeIds" : [47] 
} 


{ 
    "_id" : GUID, 
    "Country" : "France", 
    "TypeIds" : [54, 47] 
} 

Использование драйвера MongoDB C#, и на основании этих двух примеров записей, как я могу запросить для следующая информация:

  1. Все документы, которые имеют TypeIds, содержащие 47 или 54 - должно привести к 2 записи
  2. Все документы, которые имеют TypeIds, содержащие 47 и 54 - должно привести к 1 записей
  3. Все документы, имеющие TypeIds, содержащие 54 и Страна «Германия» - должно привести к 0 записей

Спасибо,
Кирона

ответ

3

У вас есть класс, как это (я просто вместо использования Guid GuidId .ToString()):

public class Test 
     { 

      public Test() 
      { 
       TypeIds = new List<int>(); 
      } 

      [BsonId] 
      public string Id { get; set; } 

      public string Country { get; set; } 

      public List<int> TypeIds { get; set; } 
     } 

я уже вставлены строки в БД по выше документов

var collection = db.Database.GetCollection("items"); 
      var id1 = Guid.NewGuid().ToString(); 
      var id2 = Guid.NewGuid().ToString(); 
      var test = new Test() { Id = id1, Country = "Germany" }; 
      test.TypeIds.Add(47); 
      var test2 = new Test() { Id = id2, Country = "France" }; 
      test2.TypeIds.Add(54); 
      test2.TypeIds.Add(47); 
      collection.Insert(test); 
      collection.Insert(test2); 

запросов:

//All documents that have TypeIds containing 47 or 54 - should result in 2 records 
     var array = new List<int>() { 47, 54 }; 
     var condition1 = collection.FindAs<Test>(Query.In("TypeIds", BsonArray.Create(array))).ToList(); 

     //All documents that have TypeIds containing 54 AND a Country of 'Germany' - should result in 0 records 
     var condition3 = collection.FindAs<Test>(Query.And(Query.EQ("TypeIds", 47), Query.EQ("Country", "Germany"))).ToList(); 

Update: Я нашел способ сделать второе условие:

//All documents that have TypeIds containing 47 AND 54 - should result in 1 records 

    var array2 = new List<int>() { 47, 54 }; 
    var query = Query.All("TypeIds",BsonArray.Create(array2)); 

    var condition2 = collection.FindAs<Test>(query).ToList(); 
+0

Думая о втором состоянии .. –

+0

Отлично, спасибо. Я отдам их и вернусь к вам. – Kieron

+0

@Kieron: Конечно, но я действительно не знаю, как сделать второе условие. В синтаксисе mongo должно быть что-то вроде этого {«TypeIds»: 47, «TypeIds»: 54} (вы можете проверить его в mongovue в окне поиска). Но по какой-то причине это не работает через драйвер C#. Но в любом случае вы можете попробовать;) –

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