簡體   English   中英

使用NoRM從F#訪問MongoDB

[英]Using NoRM to access MongoDB from F#

從F#中測試NoRM https://github.com/atheken/NoRM ,並嘗試找到一種使用它的好方法。 這是基本的C#:

class products
{
    public ObjectId _id { get; set; }
    public string name { get; set; }
}

using (var c = Mongo.Create("mongodb://127.0.0.1:27017/test"))
{
    var col = c.GetCollection<products>();
    var res = col.Find();
    Console.WriteLine(res.Count().ToString());
}

可以,但是這是我從F#訪問它的方式:

type products() = 
    inherit System.Object()

    let mutable id = new ObjectId()
    let mutable _name = ""

    member x._id with get() = id and set(v) = id <- v
    member x.name with get() = _name and set(v) = _name <- v

有沒有更簡單的方法來創建類或類型以傳遞給泛型方法?

以下是它的調用方式:

use db = Mongo.Create("mongodb://127.0.0.1:27017/test")
let col = db.GetCollection<products>()
let count = col.Find() |> Seq.length
printfn "%d" count

您是否嘗試過記錄類型?

type products = {
    mutable _id : ObjectId
    mutable name : string
    }

我不知道它是否有效,但是當您只需要一個基本上是“一組字段”的類時,記錄通常會很好。

出於好奇,您可以嘗試將無參數的構造函數添加到記錄中。 這絕對是黑客-實際上,它使用的是F#編譯器中的錯誤-但這可能有效:

type Products = 
  { mutable _id : ObjectId
    mutable name : string }
  // Horrible hack: Add member that looks like constructor 
  member x.``.ctor``() = ()

member聲明添加了一個具有特殊.NET名稱的成員,該member用於構造函數,因此.NET認為它是構造函數。 我會非常小心地使用它,但是它可能會在您的情況下起作用,因為該成員通過反射顯示為構造函數。

如果這是獲得與MongoDB這樣的庫一起使用的簡潔類型聲明的唯一方法,那么它將有希望激勵F#團隊在未來版本的語言中解決問題(例如,我可以很容易地想象一些強制F#的特殊屬性)編譯器添加無參數構造函數)。

這是一種定義接近C#定義的類的簡便方法:它具有默認構造函數,但使用公共字段而不是getter和setter,這可能是個問題(我不知道)。

type products =
    val mutable _id: ObjectId
    val mutable name: string
    new() = {_id = ObjectId() ; name = ""}

或者,如果您可以使用字段的默認值(在這種情況下,全部為null):

type products() =
    [<DefaultValue>] val mutable _id: ObjectId
    [<DefaultValue>] val mutable name: string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM