如何在MongoDB中使用BsonReader读取数组?

时间:2018-09-03 00:13:50

标签: mongodb bson

基本上,我有一个数据集,文档可以包含可变长度的数组。我正在编写一个编解码器,所以我只有BsonReader。问题是readStartArray()返回void而不是返回例如元素的数量。另外,我没有看到任何方法可以测试到达数组末尾的方法(除了尝试readEndArray()并捕获异常之外)。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我发现也缺少用于自定义序列化的文档,但是您只需要使用Reader.State属性即可。一旦确定了数组的开始,就需要遍历每个元素,直到state == BsonReaderState.EndOfArray。您需要确保仅在状态为“类型”时才调用ReadBsonType。

以下示例反序列化一系列文档:

context.Reader.ReadStartArray();

bool ctn = true;

do
{
   //If in "type" state we can call ReadBsonType. The order is important.
   if (context.Reader.State == BsonReaderState.Type)
   {
      context.Reader.ReadBsonType();
   }

   //Now that we're in a value state we can read the value safely    
   if (context.Reader.State == BsonReaderState.Value)
   {
        if (context.Reader.CurrentBsonType == BsonType.Document)
        {
           //Handle the document here. In this case pass I it to a private method    
           DeserializeChild(context, args, node);
         }
         //state will now be "type", so continue do loop and recheck type
         continue; 
    }

    if ( BsonReaderState.EndOfArray == BsonReaderState.EndOfArray)
    {
         context.Reader.ReadEndArray();
         ctn = false;
     }

} while (ctn);

答案 1 :(得分:-1)

啊,是这样的:

while (reader.readBsonType() == BsonType.DOCUMENT) {
  reader.readStartDocument();
  // ...
  reader.readEndDocument();
}

(在这种情况下,它是一个文档数组,我对BSON还是陌生的,所以我不知道它对值数组的工作方式。)