2011-12-09 7 views
0

MongoDBを使用して私のためにデータをキャッシュしようとしていますが、特定のコレクション。私は問題なしで他のコレクションを手に入れることができますが、これは動作させることができず、理由が分かりません。私が得る唯一のエラーは、次のとおりです。エラーを取得するF#のMongoDBから "Ambiguous discriminator 'revamp @ 904"(C#libを使用)

あいまいな弁別'[email protected]'

私はこれが何を意味するのかについての兆候のために長いとハード検索しました。ここで私が使用しているコードです:

let GetCacheDataObject ctxName cacheName collection = 
    let ctx = new DataContext(ctxName) 
    let q = Query.EQ("CacheName", BsonValue.Create(cacheName.ToString())) 
    let entity = 
     match ctx.Db.CollectionExists(collection) with 
     | false -> null 
     | _ -> ctx.Db.GetCollection(typeof<DataObject>, collection).FindOneAs<DataObject>(q) 
    entity 

それは彼の「FindAsOne」、このエラーがスローされます一度。

DataObjectは、データを保持する非常に基本的なカスタムオブジェクトです。

public class DataObject:IHaveIdentifier 
{ 
    public BsonObjectId _id { get; set; } 
    //public long Id { get; set; } 
    public string[] Columns { get; set; } 
    public IEnumerable<object[]> Rows { get; set; } 
    public string CacheName { get; set; } 
    public int GetColumnIndex(string column) 
    { 
     for (int i = 0; i < this.Columns.Length; i++) 
      if (this.Columns[i] == column) 
       return i; 

     return -1; 
    } 
} 

そしてIHaveIdentifierインターフェースはかなり基本的なものです::ここでは定義があります

public interface IHaveIdentifier 
{ 
    BsonObjectId _id { get; set; } 
} 

ここで最初の場所にデータを保存するために使用されたコードは次のとおりです。

member x.Save<'T when 'T :> IHaveIdentifier>(entity:'T, collection:string) = 
     if (entity._id = null) then x.Insert<'T>(entity, collection) 
     else 
      x.Delete(entity, collection) 
      x.Insert<'T>(entity, collection) 
     x.VerifyNoErrors() 

let CacheDataObject<'T when 'T :> IHaveIdentifier>(entity:'T, ctxName, collection) = 
    let ctx = new DataContext(ctxName) 
    ctx.Save(entity, collection) 

このコードは、先日働いていて何か変わってしまって、何が起こっているのか分からないようです。

UPDATE:

+1

「revamp」は、seq.fsのFSharp.Coreで使用される識別子です。 (私はおそらくこのコードはlambdaや何かの引数名の中にあるかもしれないと推測しているでしょうか?) – Brian

+0

ブライアン、私はそれを考えていましたが、どうやって見ることができませんでした。唯一のパラメータは、渡されるすべての文字列です。どのように私はそれをトレースするかもしれないのアイデアはありますか? – Erick

答えて

1

ブライアンとロバート あなたのご意見は、何が起こっているかを正確に把握するのに役立ちました。私は、IEnumberable Rowsプロパティがまさに問題であると判断できました。私は行をセグに設定していました。 F#Seqでは、この場合、行が実際の結果ではなく関数の出力値(refのようなもの)に設定されていることを意味する遅延評価が行われます。 Seq.ToArrayを使用して行を変換すると、すべてが期待通りに機能しました。

私に正しい道を教えてくれてありがとう。

1

上の最初のセーブコードを追加しましたあなたはモンゴシェルで同等のクエリを実行し、既存の文書がどのように見えるかを確認することができます。

私の疑念は、問題を引き起こしている "_t"値があることです。もしそうなら、問題はFindOneではなく、最初に文書がどのように保存されたかで問題になるので、さらに前に戻って調べなければならないかもしれません。

+0

IEnumerable Rowsプロパティにも関連している可能性があります。何かが型オブジェクトとして宣言されるときは、シリアル化された値はデシリアライザにデータを読み込む際にどのような実際の型をインスタンス化するかを伝える "_t"弁別器を持ちます。おそらく、あなたの値のいくつかは、C#ドライバがうまく処理できないF#固有のデータ型です(F#でテストを行っていません)。 –

+0

ロバート、私は初期保存で使用されるコードを追加しました。私はコンソールでチェックし、正しく保存しているようです(コンソールにすべてが表示されないように行が多すぎます)。行は、いくつかのint値、2つの10進数のオブジェクト、および場合によってはnullの文字列で構成されています。小数点のオブジェクトには引用符が付いています。他に何ができるのか、どうすれば "_ _"値を確認できるか教えてください。 – Erick

+0

読んでいない実際の文書を見つけて、それをmongoシェルで調べる必要があります(恐らくfindだけであれば最初に表示される文書かもしれません)。文書に機密情報が含まれているかどうかはわかりませんが、もしそれが役に立ちそうであれば、それを見ることができます。また、スタックトレースを提供できますか? –

関連する問題