2015-08-03 9 views
14

ho trovato il modo per controllare è il valore contiene in semplice array:MongoDb C# conducente trovare voce in ordine per valore di campo

var filter = Builders<Post>.Filter.AnyEq(x => x.Tags, "mongodb"); 

Ma come trovare un elemento complesso, con molti campi da un campo di cemento? Ho trovato il modo di scriverlo tramite l'approccio dot notation con il builder BsonDocument, ma come posso farlo con le notazioni lambda digitate?

upd

Penso che sia una sorta di

builderInst.AnyIn(p => p.ComplexCollection.Select(ml => ml.Id), mlIds) 

ma non può controllare in questo momento, è qualcuno potrebbe aiutare?

+0

Sembra un compito della MongoDb University. –

+0

Possibile duplicato di [MongoDB + C# driver + array di query di elementi in cui ogni elemento dell'array contiene sub-documento da interrogare su] (http://stackoverflow.com/questions/12024087/mongodb-c-sharp-driver-query-array -di-elementi-dove-ogni-matrice-elemento-cont) –

risposta

16

C'è ElemMatch

var filter = Builders<Post>.Filter.ElemMatch(x => x.Tags, x => x.Name == "test"); 
var res = await collection.Find(filter).ToListAsync() 
+0

Questa non è una soluzione ottimale. La soluzione migliore è utilizzare http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_FilterDefinitionBuilder_1_AnyIn__1_1.htm – shiva8

+2

@ shiva8 Non puoi usare 'AnyIn' quando hai una serie di oggetti complessi. – rnofenko

1

A partire dalla 2.4.2 rilascio dei driver C#, l'interfaccia IFindFluent può essere utilizzato per l'esecuzione di query su elemento dell'array. ElemMatch non può essere utilizzato direttamente su una serie di stringhe, mentre l'interfaccia di ricerca funzionerà su tipi semplici o complessi (ad esempio "Tags.Nome") ed è fortemente digitato.

  FilterDefinitionBuilder<Post> tcBuilder = Builders<Post>.Filter; 
      FilterDefinition<Post> tcFilter = tcBuilder.Eq("Tags","mongodb") & tcBuilder.Eq("Tags","asp.net"); 
       ... 
      await myCollection.FindAsync(tcFilter); 

conducente Linq utilizza il framework di aggregazione, ma per una query senza operatori di aggregazione un ritrovamento è più veloce.

Si noti che questo è stato rotto nelle versioni precedenti del driver in modo che la risposta non fosse disponibile al momento della pubblicazione originale.