我有一个expandoObject d,我想迭代一个字典,并使用它的键和值来创建一个新对象,{key:value,key:value},然后将该新对象分配给d,当然最后将其序列化为bsonDocument以便插入。
如果只是拿字典并执行.toArray(),我就不会得到mongoDB序列化错误,但是如果我从那个新对象中创建一个新的expandObject,或者只是简单地传递我提到的字典作为d.newObject我得到一个无用的mondodb序列化错误。
我将如何解决这个问题(1),以及我对BSON文档期望什么能够和不能序列化的内容有什么遗漏?
答案 0 :(得分:0)
而不是从头开始使用ExpandoObject
为MongoDB编写这种动态类型功能,您可以从使用动态ORM或ODM(例如Slazure)中获益,MongoDB支持仍然处于封闭测试状态但是应尽快公开发布。下面是一个示例,其中Slazure Linq查询从“TestCustomers”集合返回一些文档,并将每个文档属性名称写入控制台:
using SysSurge.Slazure.MongoDB.Linq;
using SysSurge.Slazure.Core;
using SysSurge.Slazure.Core.Linq.QueryParser;
public void EnumProperties()
{
// Get a reference to the collection
dynamic storage = new QueryableStorage<DynDocument>("mongodb://user:pass@example.org/MongoDBExample");
QueryableCollection<DynDocument> collection = storage.TestCustomers;
// Build collection query
var queryResult = collection.Where("SignedUpForNewsletter = true and Age < 22");
foreach (DynDocument document in queryResult)
{
foreach (KeyValuePair<string, IDynProperty> keyValuePair in document)
{
Console.WriteLine(keyValuePair.Key);
}
}
}
如果你需要实际获得BsonDocument
对象,那么你可以通过调用DynDocument
方法从Slazure Document
对象中获取它,例如:
foreach (DynDocument document in queryResult)
{
BsonDocument bsonDoc = document.Document
Console.WriteLine(bsonDoc["someProperty"].AsString());