Невозможно использовать перегруженное выражение LINQ для MongoDB. Драйвер включает ProjectionDefinition - PullRequest
0 голосов
/ 31 октября 2018

Я с трудом пытаюсь выполнить агрегацию в базе данных MongoDB с помощью F #. Я построил этот крошечный пример кода для иллюстрации:

open System
open MongoDB.Driver
open MongoDB.Bson

type MyDocument =
    { Id  : BsonObjectId
      Foo : string
      Bar : int
      Baz : bool
      Quz : DateTime }

[<EntryPoint>]
let main _ =
    let client = new MongoClient("mongodb://localhost:27017/faggregate")
    let db = client.GetDatabase("faggregate")
    let collection = db.GetCollection<MyDocument>("aggregations")

    let documents = collection.Aggregate().Group(Builders<MyDocument>.Projection.Include(fun x -> x.Foo))

    0

Это застряло на:

No overloads match for method 'Include'. The available overloads are shown below.
member Include: 
   field: FieldDefinition<MyDocument> 
       -> ProjectionDefinition<MyDocument>

Но ProjectionDefinitionBuilder имеют public ProjectionDefinition<TSource> Include(Expression<Func<TSource, object>> field)

Кто-нибудь уже мог использовать агрегаты MongoDB с F #?

1 Ответ

0 голосов
/ 31 октября 2018

op_Implicit это ключ! Видел в документации MongoDB, что ProjectionDefinition s может быть создано из простых старых строк (JSON-единиц), но в F # этот оператор implicit должен явно вызываться с использованием op_Implicit. Итак ...

let group = ProjectionDefinition<MyDocument,_>.op_Implicit("""{ _id: "$Foo"}""")
let documents = collection.Aggregate().Group(group)

Работая как заклинание, я могу писать агрегаты, как в чистом монго

...