专栏首页岑玉海RavenDb学习(八)高级特性上半部分

RavenDb学习(八)高级特性上半部分

1、事务支持
别的关系型数据库和RavenDb一起使用

using (var transaction = new TransactionScope())
{
    BlogPost entity = session.Load<BlogPost>("blogs/1");
 
    entity.Title = "Some new title";
 
    session.SaveChanges(); // will create HTTP request
 
    session.Delete(entity);
 
    session.SaveChanges(); // will create HTTP request
 
    transaction.Complete(); // will commit transaction
}

2、文档元数据
Raven-Clr-Type - Records the CLR type, set and used by the JSON serialization/deserialization process in the Client API.
Raven-Entity-Name - Records the entity name, aka the name of the RavenDB collection this entity belongs to.
Non-Authoritive-Information - This boolean value will be set to true if the data received by the client has been modified by an uncommitted transaction. You can read more on it in the Advanced section.
Temp-Index-Score - When querying RavenDB, this value is the Lucene score of the entity for the query that was executed.
Raven-Read-Only - This document should be considered read only and not modified.
Last-Modified - The last modified time-stamp for the entity.
@etag - Every document in RavenDB has a corresponding e-tag (entity tag) stored as a sequential Guid. This e-tag is updated by RavenDB every time the document is changed.
@id - The entity id, as extracted from the entity itself.
获取最后修改时间的例子:
var product = session.Load<Product>(1);
RavenJObject metadata = session.Advanced.GetMetadataFor(product);
// Get the last modified time stamp, which is known to be of type DateTime
DateTime collectionName = metadata.Value<DateTime>("Last-Modified");

返回所有表的表名的map函数:
from doc in docs
where doc["@metadata"]["Raven-Entity-Name"] != null
select new { Tag = doc["@metadata"]["Raven-Entity-Name"] };

//修改元数据
1)通过session.Advanced.GetMetadatFor(entity) 获取元数据,然后修改并保存
2)通过documentStore.RegisterListener(myStoreListener) 注册一个IDocumentStoreListener,当有session要进行保存的时候,它能修改元数据

3、查询指定列
分页查询某个列
var firstPage = session.Advanced.DocumentStore.DatabaseCommands.GetTerms("indexName", "MyProperty", null, 128);
var secondPage = session.Advanced.DocumentStore.DatabaseCommands.GetTerms("indexName", "MyProperty", firstPage.Last(), 128);

4、动态列

public class Product
{
    public string Id { get; set; }
    public List<Attribute> Attributes { get; set; }
}
 
public class Attribute
{
    public string Name { get; set; }
    public string Value { get; set; }
}

上述例子,一个产品有很多个属性,属性的类型是不固定的,需要是dynamic的

//创建索引
public class Product_ByAttribute : AbstractIndexCreationTask<Product>
{
    public Product_ByAttribute()
    {
        Map = products => from p in products
                          select new
                                     {
                                         _ = p.Attributes
                                            .Select(attribute =>
                                                CreateField(attribute.Name, attribute.Value, false, true))
                                     };
    }
}

//我们对值并不关注,只是希望调用CreateField方法,所以用_作为一种转换反射。

//查询
var products = session.Advanced.LuceneQuery<Product>("Product/ByAttribute")
    .WhereEquals("Color", "Red")
    .ToList();
这样子它不仅仅支持字符串,也支持数字等


5、自定义序列化

当RavenDb收到一个POCO的时候,它会默认把它序列化为JSON格式的数据。

1)忽略一个属性

public class Carrot
{
    public string Id { get; set; }
 
    public decimal Length { get; set; }
 
    [JsonIgnore]
    public decimal LengthInInch
    {
        get
        {
            /* some calculations */
            return this.Length;
        }
 
        set
        {
            //...
        }
    }
}

2)序列化的时候更换名字

public class Recipe
{
    public string Id { get; set; }
 
    [JsonProperty(PropertyName = "dishes")]
    public IList<IVegetable> SideDishes { get; set; }
}

3)允许自引用
//树形结构数据
[JsonObject(IsReference = true)]
public class Category
{
    public string Id { get; set; }
    public string Name { get; set; }
    public Category Parent { get; set; }
    public List<Category> Children { get; set; }
 
    public Category()
    {
        this.Children = new List<Category>();
    }
 
    public void Add(Category category)
    {
        category.Parent = this;
        this.Children.Add(category);
    }
}

4)自定义IContractResolver实现是序列 

store.Conventions.JsonContractResolver = new DefaultContractResolver(shareCache: true)
                                             {
                                                 DefaultMembersSearchFlags =
                                                     BindingFlags.Public | BindingFlags.Instance
                                             };

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RavenDb学习(五)结果转换

    1)Result Transformers public class Order { public DateTime OrderedAt { get;...

    岑玉海
  • RavenDb学习(四)处理文档相关性

    RavenDb是文档型数据库,但是我们常常也需要定义对象之间的关系,那RavenDb当中是如何处理的呢? RavenDb提供了优雅的解决方式,使用正确的话,可以...

    岑玉海
  • hbase源码系列(七)Snapshot的过程

      在看这一章之前,建议大家先去看一下snapshot的使用。可能有人会有疑问为什么要做Snapshot,hdfs不是自带了3个备份吗,这是个很大的误区,要知道...

    岑玉海
  • [C#6] 6-表达式形式的成员函数

    0. 目录 C#6 新增特性目录 1. 老版本的代码 1 internal class Person 2 { 3 public string Fi...

    blackheart
  • Zookeeper应用之——选举(Election)

    请注意,此篇文章并不是介绍Zookeeper集群内部Leader的选举机制,而是应用程序使用Zookeeper作为选举。

    小忽悠
  • Zookeeper应用之——选举(Election)

    请注意,此篇文章并不是介绍Zookeeper集群内部Leader的选举机制,而是应用程序使用Zookeeper作为选举。

    小忽悠
  • JAVA的toString方法的一个小例子

    Object是一个抽象类,他有很有方法,其中的toString方法是我们常见的一个方法,我们可以看这段代码

    阮键
  • 四种任务调度的 Java 实现 转

     java.util.Timer 了,它是最简单的一种实现任务调度的方法,下面给出一个具体的例子:

    wuweixiang
  • Python抓取炉石传说卡牌,做一个女神的拼图游戏

    网站其实已经加载了所有的卡牌原画 只是之后的原画做了隐藏处理默认不展示  style=display

    猫咪编程
  • 字符串 模式匹配

    要点 模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。 假设P是给定的子串,T是待查找的字...

    静默虚空

扫码关注云+社区

领取腾讯云代金券