MongoDB,C#,Linq,Query,对通用List项的更新

时间:2014-10-07 07:06:32

标签: c# .net linq mongodb

我是MongoVerse的新手,但我的问题如下:

var connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
var database = server.GetDatabase("test");
var collection = database.GetCollection<Entity>("entities");

var entity = new Entity { Name = "Tom" };
collection.Insert(entity);
var id = entity.guid;

var query = Query<Entity>.EQ(e => e.guid, id);

var entity2 = collection.FindOne(query);
Console.WriteLine("Getting entity2 works!");

for (int i = 0; i < 100; i++)
{
     var ourPoint = ((MongoQueryable<List<SubEntity<object>>>)(from q in collection.AsQueryable<Entity>() where q.guid == id select q.thePackage)).GetMongoQuery();
     var ourUpdate = Update<List<SubEntity<object>>>.Set(q => q[i], new SubEntity<object>() { value = 3.14 });
     collection.Update(ourPoint, ourUpdate);
}

var entity3 = collection.FindOne(query);
Console.WriteLine("Getting entity3 throws an error!");

System.IO.FileFormatException:元素'0'与类命名空间+实体的任何字段或属性都不匹配

我正在序列化的课程如下:

public class Entity
{
    [BsonId]
    public ObjectId guid = new ObjectId();
    public string Name = "";
    public List<SubEntity<object>> thePackage = new List<SubEntity<object>>();

    public Entity()
    {
        for (int i = 0 ; i < 100; i++)
        {
            thePackage.Add(new SubEntity<object>() { value = Math.PI });
        }
    }
}

子类是:

public class SubEntity<T>
{
    public DateTime dateTime = DateTime.Now;
    public T value = default(T);
}

我怀疑,Linq查询不受支持,或者没有正确发生。我从文档中看到的是,Select查询是在客户端执行的,但是使用StopWatches,执行操作所需的时间显示正确(而不是覆盖整个List&lt;&gt;)。

我在数据分析模式上阅读了一些内容(在Mongo的网站上),流行的方案似乎涉及创建一个包含空白条目的数组的文档(小时,天,周,取决于你的频率)取一个数字,然后一次写一个值。

我对Linq问题感到好奇吗?谁知道我的下一站会是什么?但是,我真的只是希望得到一个如何从数组中一次更新1个值的好例子。 (我可能不知道数据类型或提前的数组大小)

我会继续寻找(它已经很晚了,所以我的搜索可能会被推迟),如果我找到答案,我会回复我的答案。

我正在使用MongoDB 2.6 Standard for Windows 8(64位Windows和mongo)。我也在Windows 7机器上复制了这个bug。

我从未找到答案,但我改变了方法。(2014年10月9日)

我自己使用BsonDocument类进行了序列化。写入时间从60ms到不到1ms。在大约6毫秒之前替换列表中的一个项目。我仍然不确定如何替换任意BsonArray元素,但它足够快,不再是一个问题。

1 个答案:

答案 0 :(得分:0)

不支持此行:

Update<List<SubEntity<object>>>.Set(q => q[i], new SubEntity<object>() { value = 3.14 });

我们在第一个参数中需要一个元素名称,而q [i]不是一个。但是,这看起来像我们应该修复的错误。您可以在CSHARP项目下的jira.mongodb.org上免费提交Jira门票。

目前,您需要使用无类型查询构建器。