Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“获取错误”;模糊鉴别器';revamp@904&引用;来自F#中的MongoDB(使用C#lib)_C#_Mongodb_F# - Fatal编程技术网

“获取错误”;模糊鉴别器';revamp@904&引用;来自F#中的MongoDB(使用C#lib)

“获取错误”;模糊鉴别器';revamp@904&引用;来自F#中的MongoDB(使用C#lib),c#,mongodb,f#,C#,Mongodb,F#,我试图使用MongoDB为我缓存一些数据,但我似乎无法让代码返回特定的集合。我可以毫无问题地获得其他收藏,但对于这一个,我无法让它工作,我也不知道为什么。我得到的唯一错误是: 歧义鉴别器'revamp@904“ 对于这意味着什么,我已经进行了漫长而艰苦的探索。以下是我使用的代码: 让GetCacheDataObject ctxName cacheName集合= 设ctx=newdatacontext(ctxName) 让q=Query.EQ(“CacheName”,BsonValue.Creat

我试图使用MongoDB为我缓存一些数据,但我似乎无法让代码返回特定的集合。我可以毫无问题地获得其他收藏,但对于这一个,我无法让它工作,我也不知道为什么。我得到的唯一错误是:

歧义鉴别器
'revamp@904“

对于这意味着什么,我已经进行了漫长而艰苦的探索。以下是我使用的代码:

让GetCacheDataObject ctxName cacheName集合=
设ctx=newdatacontext(ctxName)
让q=Query.EQ(“CacheName”,BsonValue.Create(CacheName.ToString()))
让实体=
将ctx.Db.CollectionExists(集合)与
|false->null
|->ctx.Db.GetCollection(typeof,collection).FindOneAs(q)
实体
一旦输入“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;
    }
}
以下是最初用于保存数据的代码:

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)
成员x.保存IHaveIdentifier>(实体:T,集合:字符串)=
如果(entity.\u id=null),则x.Insert(entity,collection)
x、 验证无错误()
让CacheDataObject IHaveIdentifier>(实体:'T、ctxName、集合)=
设ctx=newdatacontext(ctxName)
保存(实体、集合)
这段代码前几天起作用了,后来发生了一些变化,我似乎不知道发生了什么


更新:在上面添加了初始保存代码

您可以在mongo shell中运行等效的查询并查看现有文档的外观

我的怀疑是,它的“t”值导致了问题。如果是这样的话,问题不在于FindOne,而在于文档最初是如何保存的,因此我们可能需要进一步回顾并研究它。

Brian和Robert, 你的意见帮助我弄清楚到底发生了什么。我能够确定IEnumberable Rows属性正是问题所在。我正在将行设置为seq。在F#Seq中,延迟计算,这意味着行被设置为函数的输出值(有点像ref),而不是实际结果。一旦我使用Seq.ToArray转换了行,那么一切都按预期进行了


非常感谢你们两位为我指明了正确的方向。

我知道
reform
是seq.fs中FSharp.Core中使用的一个标识符,以防有帮助。(我猜这段代码可能是在查找lambda的参数名,或者其他什么?)Brian,我有点这样想,但我还不知道怎么做。唯一的参数是传入的所有字符串。你知道我如何追踪它吗?它也可能与IEnumerable Rows属性有关。每当某个对象被声明为类型对象时,序列化的值就会有一个“\t”鉴别器,告诉反序列化程序在读回数据时要实例化的实际类型。也许您的一些值是特定于F的数据类型,而C#驱动程序没有成功处理这些数据类型(我们没有使用F#进行任何测试)。Robert,我添加了用于初始保存的代码。我在控制台中进行了检查,它似乎保存正确(因为行太多,所以我无法在控制台中看到所有行)。行由几个int值、2个十进制对象和一个有时为null的字符串组成。我注意到十进制对象周围有引号。让我知道我还可以做什么,或者如何检查“\t”值。您必须找到无法读取的实际文档,并查看mongo shell中的文档(如果您只进行查找,可能会看到前几个文档)。我不知道文件中是否有机密信息,但如果我能看一下,那会有所帮助。另外,你能提供一个堆栈跟踪吗?顺便说一句,我不熟悉F#所以我对这一部分不太了解。。。很抱歉
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)