0

さて、私は Couchbase 2.0 と最新の .NET クライアントで作業しています。基本的に私が書いているのは、目標を追跡するためのプロジェクトです (美化された to-do リスト)...

私は目標オブジェクトをJSONドキュメントとしてcouchbase内に保存し、それを逆シリアル化してPOCOに戻すことができましたが、私の質問は、リンクされたドキュメントを自動的に検索してsubGoal List<Goal>に入力する方法です

この種の自動デシリアライゼーションが、コード自体の中でそれを処理するためのロジックなしで可能かどうかはわかりませんが、ポインタは高く評価されています, 乾杯!

JSON

{
    id: "goal_1",
    name: "goal 1",
    description: "think of some better projects",
    subGoals: [goal_2, goal_3]
}

C#

var goal = client.GetJson<Goal>(id);
return goal;

POCOはこちら

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;

namespace stuff.Models
{
    public class Goal
    {
        protected DateTime _targetDate;

        /// <summary>
        /// Name of the goal
        /// </summary>
        [JsonProperty("name")]
        public String Name { get; set; }

        /// <summary>
        /// Full description of the goal
        /// </summary>
        [JsonProperty("description")]
        public String Description { get; set; }

        /// <summary>
        /// Target date for completing this goal
        /// </summary>
        [JsonProperty("targetDate")]
        public DateTime? TargetDate
        {
            get
            {
                return _targetDate;
            }
            set
            {
                // target date must be later than any sub-goal target dates
            }
        }

        /// <summary>
        /// Any sub-goals
        /// </summary>
        [JsonProperty("subGoals")]
        public List<Goal> SubGoals { get; set; }

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="Name"></param>
        /// <param name="Description"></param>
        /// <param name="TargetDate"></param>
        /// <param name="SubGoals"></param>
        public Goal(String Name, String Description, DateTime? TargetDate = null, List<Goal> SubGoals = null)
        {
            this.Name = Name;
            this.Description = Description;
            this.TargetDate = TargetDate;
            this.SubGoals = SubGoals;
        }
    }
}
4

1 に答える 1

2

関連するドキュメントを1つの「結合」クエリに自動的に戻す方法はありませんが、照合されたビューを使用することはできます。したがって、以下のような一連の目標が与えられます(タイププロパティの追加に注意してください)。

{"name":"goal 1","description":"This is a parent goal","subgoals":["goal2","goal3"],"type":"goal"}
{"name":"goal 2","description":"This is a child goal","type":"goal"}
{"name":"goal 3","description":"This is another child goal","type":"goal"}
{"name":"goal 4","description":"This is another parent goal","subgoals":["goal5","goal6","goal7"],"type":"goal"}
{"name":"goal 5","description":"This is a child goal","type":"goal"}
{"name":"goal 6","description":"This is a child goal","type":"goal"}
{"name":"goal 7","description":"This is a child goal","type":"goal"}

次に、各親の目標とそれに続く子を出力するビューを記述します。

function (doc, meta) 
{
  if (doc.type == "goal" && doc.subgoals)
  {
    emit([meta.id, 0], null);
        for(var idx in doc.subgoals)
        {
          emit([doc.subgoals[idx], 1], null);
        }    
  }
}

このビューの出力は行のセットであり、各行には、親IDと0、それに続く子と1で構成されるキーが含まれます(0と1は、行が正しく順序付けられていることを確認します)。

{"id":"goal1","key":["goal1",0],"value":null},
{"id":"goal1","key":["goal2",1],"value":null},
{"id":"goal1","key":["goal3",1],"value":null},
{"id":"goal4","key":["goal4",0],"value":null},
{"id":"goal4","key":["goal5",1],"value":null},
{"id":"goal4","key":["goal6",1],"value":null}

.NET SDKチュートリアルでは、照合されたビュー(醸造所とそのビール)をクエリする方法について説明します。

http://www.couchbase.com/docs/couchbase-sdk-net-1.2/collat​​edviews.html

于 2013-01-14T17:29:10.450 に答える