MongoDB и комплексный поиск по массиву - PullRequest
3 голосов
/ 27 января 2011

В Mongo хранится около 37 тыс. Документов, которые выглядят примерно так:

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


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

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

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

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

1 Ответ

3 голосов
/ 27 января 2011

У вас есть такой класс (я просто вместо 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();

Обновление : я нашел способ выполнить второе условие:

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