我有一个网络表单,用户可以动态添加文本字段。然后,他可以将数据输入到这些文本字段中并提交表单,然后将其保存到MongoDB。
然后我想从MongoDB中检索一些数据。但我不知道该怎么做。
通常我会事先定义entity
类。类似的东西:
public class User
{
public string Name {get;set;}
public int Age {get;set;}
}
然后我通常会有一些能够从MongoDB中检索数据的存储库类。
var userRepo = new Repository<User>();
var user = userRepo.Where(x => x.Name == "something");
但是由于这些表单字段是动态构建的,所以我无法在编译时为它定义class
。
因此在这种情况下使用我的repo类不会起作用:
var someRepo = new Repository<What_To_Put_Here?>();
这意味着我不能使用方便的LINQ表达式,因为MongoDB中的集合不代表我的代码中的任何类。
我不知道我的新模式应该如何通过我的Repository
类来搜索MongoDB。我仍然喜欢以某种方式使用LINQ来搜索(动态构建)集合。
无论如何我能解决这个问题吗?
答案 0 :(得分:0)
由于您在编译时不知道类型及其属性,因此不能使用LINQ。当然你可以做一些疯狂的事情来使用LINQ(想到反思......),但这不会让事情变得更好,只会更糟。如果在编译时不知道数据模式,那么使用编译时帮助程序是没有意义的。
使用查询构建器(using MongoDB.Driver.Builders
)代替,例如类似的东西:
db.GetCollection("CollectionName").Find(Query.EQ("MyFieldName", value));
优点是它允许动态构建查询,缺点是它没有强类型,所以你可能会不小心要求一个甚至不存在的字段,但这个问题是动态类型所固有的。
使用键值对而不是将用户的架构映射到实际的mongodb架构可能是个好主意,例如:使用{ "form" : "foo", "customValues" : [ { "key" : "domain", "value" : "acme.com"}, ... ] }
而不是实际添加像{ "form" : "foo", "domain" : "acme.com" }
这样的字段,因为后者不会将数据与他们的数据分开,容易发生冲突,数据迁移方案很难并且无法索引。