试图获取包含嵌套文档的文档

本文关键字:文档 嵌套 包含 获取 | 更新日期: 2023-09-27 18:16:28

尝试从集合中获取文档,文档中包含嵌套文档。

得到一个错误消息,说"期望一个嵌套的文档表示一个Project.Models.MapTags值的序列化形式,但是发现一个字符串的值"

代码

这是获取集合并执行查询的方法。

public List<Maps> GetAllMapsByUserId(ObjectId userId)        
                  {            
                      using (_server.RequestStart(_db))            
                      {                
                          var query = Query.EQ("UserId", userId);
                          MongoCursor<Maps> maps = _db.GetCollection<Maps>"Maps").FindAs<Maps>(query);
                          var list = maps.ToList();
                          return list;            
                      }
                  }

这是包含对象

的类
namespace Project.Models 
{    
public class Maps    {        
    [BsonId]        
    public ObjectId Id { get; set; }
    public ObjectId UserId { get; set; }
    public string MapName { get; set; }
    public string Description { get; set; }
    public BsonBoolean PublicMap { get; set; }
    public DateTime Created { get; set; }
    [BsonIgnoreIfNull]
    public List<MapTags> Tags { get; set; }
    [BsonIgnoreIfNull]
    public List<MapVotes> Votes { get; set; }
    }
public class MapVotes
{
    public ObjectId VoterId { get; set; }
    public int VoteValue { get; set; }
}
public class MapTags
{
    public string Tag { get; set; }
}
}

希望有人有一个想法/提示或类似的,一直在搜索和测试很长时间,还没有找到一个解决方案。

更新:

下面是一个数据库中的数据示例

  { 
    "_id" : ObjectId("4eda2415851e702684bf6392"), 
    "MapName" : "Test", 
    "Description" : "Test", 
    "Created" : ISODate("2011-12-03T13:28:53.698Z"), 
    "PublicMap" : false,
    "UserId" : ObjectId("4e8033a0851e701c7c1e12e1"), 
    "Tags" : [ "Test", "Kalle", "Jonas", "Fredrik" ] 
  }

试图获取包含嵌套文档的文档

看起来序列化器期望的是文档,但是找到的是字符串。

问题是你序列化了一个字符串数组:

{
   "MapName" : "SomeMapName"
   "Tags" : ["tag1", "tag2"] // list of strings
   // ...
}

但是你应该有

{
   "MapName" : "SomeMapName"
   "Tags" : [ { /* map tag document */ }, { /* map tag document */ }, ...]
   // ...
}

反序列化器期望找到一个文档,但是只找到一个字符串。现在,MapTag类可以使用字符串进行序列化,也可以从字符串重新构造,但是您必须为此提供自定义序列化器。非常简单。