如果你使用Couchbase服务器作为存储JSON文档的文档数据库的话,我相信 它的大部分功能都能得以发挥。比如,你可以使用N1QL!然而,有些时候你需要使用Couchbase存储其它的数据。在这篇博客中,我将向你展示如何将XML和二进制数据存储到Couchbase中。我会使用.NET的SDK,但我相信其他的SDK也支持这些操作。
存储JSON文档回顾
快速地回顾一下在Couchbase中存储JSON文档的知识。一旦你有了一个bucket,你就可以使用Insert/Upsert来创建/更新一个文档,然后使用Get将文档读取出来。使用.NET SDK,你可以按照所定义的类型自动处理序列化。 1 2 3 4 5 | bucket.Insert<MyType>( "JSON_" + guid, new MyType { Foo = "BarJSON" });
var jsonBackOut = bucket.Get<MyType>( "JSON_" + guid).Value;
Console.WriteLine($ "JSON document: {jsonBackOut.Foo}" );
|
存储XML
存储XML需要多做一点工作。首先,我使用XmlSerializer将对象序列化为XML字符串。然后,我将该值Insert成为一个字符串。为了将其读取出来,我再次使用xmlseralizer将其从字符串转换成为一个类型。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var xmlo = new MyType {Foo = "BarXML" };
var xml = new XmlSerializer(xmlo.GetType());
using (var textWriter = new StringWriter())
{
xml.Serialize(textWriter, xmlo);
bucket.Insert<string>( "XML_" + guid, textWriter.ToString());
}
var xmlBackOut = bucket.Get<string>( "XML_" + guid).Value;
using (var reader = new StringReader(xmlBackOut))
{
var xmlObject = (MyType)xml.Deserialize(reader);
Console.WriteLine($ "XML: {xmlObject.Foo}" );
}
|
存储一个字节数组序列化接下来,我要将对象序列化为一个byte数组。不像JSON和XML,存储成一个字节数组意味着只能将该对象再次序列化成为.NET对象。 该过程类似于XML,除了Insert和Get定义的byte[]而不是string,并且我使用BinaryFormatter代替XmlSerializer。 1 2 3 4 5 6 7 8 9 10 11 12 13 | var formatter = new BinaryFormatter();
using (var ms = new MemoryStream())
{
formatter.Serialize(ms, new MyType { Foo = "BarDotNET" });
bucket.Insert< byte []>( "byte_" + guid, ms.ToArray());
}
var bytesBackOut = bucket.Get< byte []>( "byte_" + guid).Value;
using (var stream = new MemoryStream(bytesBackOut))
{
var bytesObject = (MyType)formatter.Deserialize(stream);
Console.WriteLine($ ".NET: {bytesObject.Foo}" );
}
|
总结
运行终端示例程序 (源代码在Github) produces: 当你运行上面的示例代码后,你会看到Couchbase控制台的显示如下: non-JSON文档会和JSON文档存在同一个bucket中。但正如你所看到的,Couchbase服务器并不知道如何解释它们。所以,你不能对这些文件执行大多数的N1QL操作。你不能像JSON文档那样索引它们的值。并且,在使用.NET字节数组的情况下,一个非.NET程序将根本无法解释他们。
如果你能将数值存储到JSON文档中,我推荐你这样做。但是,Couchbase服务器为你提供了存储其它类型数值的灵活性。
|