2011-01-27 5 views
3

J'ai quelques 37K documents stockés dans Mongo qui ressemble à ceux-ci:MongoDB et Array Complex Recherche

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


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

Utilisation du pilote MongoDB C#, et sur la base des deux exemples d'enregistrements, comment puis-je interroger la informations suivantes:

  1. Tous les documents qui ont TypeIds contenant 47 ou 54 - devrait donner lieu à 2 dossiers
  2. Tous les documents qui ont TypeIds contenant 47 ET 54 - devrait aboutir à 1 enregistrements
  3. Tous les documents qui ont TypeIds contenant 54 et un pays de « Allemagne » - devrait donner lieu à 0 enregistrements

Merci,
Kieron

Répondre

3

Vous avez la classe comme ça (je viens au lieu d'utiliser 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; } 
     } 

i ai inséré dans les rangées au-dessus db selon documents

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); 

Requêtes:

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

Mise à jour: J'ai trouvé moyen de faire deuxième condition:

//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

réflexion sur deuxième condition .. –

+0

Excellent, merci. Je vais les essayer et revenir vers vous. – Kieron

+0

@Kieron: bien sûr, mais je ne sais pas comment faire la deuxième condition. Dans la syntaxe mongo devrait être quelque chose comme ceci {"TypeIds": 47, "TypeIds": 54} (vous pouvez le vérifier dans mongovue à la fenêtre de recherche). Mais pour une raison quelconque, cela ne fonctionne pas avec le pilote C#. Mais de toute façon vous pouvez essayer;) –