“获取错误”;模糊鉴别器';revamp@904&引用;来自F#中的MongoDB(使用C#lib)
我试图使用MongoDB为我缓存一些数据,但我似乎无法让代码返回特定的集合。我可以毫无问题地获得其他收藏,但对于这一个,我无法让它工作,我也不知道为什么。我得到的唯一错误是: 歧义鉴别器“获取错误”;模糊鉴别器';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
'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)