2012-05-11 24 views
3

ネストされたドキュメントをC#を使用してMongoDBに挿入しようとしています。カテゴリと呼ばれるコレクションがあります。そのコレクションには、配列が2つ、カテゴリが1つ、標準が1つのドキュメントが存在しなければなりません。これらの配列の中には、上記の同じ名前の配列も含まれる独自のIDを持つ新しい文書が存在する必要があります。以下は私がこれまで行ってきたことですが、進める方法がわかりません。私がしたいコードを見ているならば、 "namingConventions"ドキュメントをcategoriesドキュメントのcategories配列の下にネストして追加しますが、namingConventionsも一意のIDを持たなければなりません。C#でMongoDBにネストされたドキュメントを挿入する

この時点で私は可能な限り最良の方法を実行したとは確信していませんので、私はこの全体のすべてのアドバイスをすべて公開しています。私は何をやっていることはコーディング標準のサイトを構築して

namespace ClassLibrary1 
{ 
using MongoDB.Bson; 
using MongoDB.Driver; 
public class Class1 
{ 
     public void test() 
     { 
      string connectionString = "mongodb://localhost"; 
      MongoServer server = MongoServer.Create(connectionString); 
      MongoDatabase standards = server.GetDatabase("Standards"); 
      MongoCollection<BsonDocument> categories = standards.GetCollection<BsonDocument>("catagories"); 

      BsonDocument[] batch = { 
             new BsonDocument { { "categories", new BsonArray {} }, 
                 { "standards", new BsonArray { } } }, 
             new BsonDocument { { "catagories", new BsonArray { } }, 
                 { "standards", new BsonArray { } } }, 
            }; 
      categories.InsertBatch(batch); 

      ((BsonArray)batch[0]["categories"]).Add(batch[1]); 
      categories.Save(batch[0]);   
     } 
    } 
} 

は、明確にするために、これは私が必要なものです。 MongoDBに保存されているすべての標準がツリー内に存在することが求められます。すべてが一意のIDを持たなければならないので、ツリーとして照会されることの上でそれ自身で照会することもできます。例は次のようになります。

/* 0 */ 
{ 
    "_id" : ObjectId("4fb39795b74861183c713807"), 
    "catagories" : [], 
    "standards" : [] 
} 

/* 1 */ 
{ 
    "_id" : ObjectId("4fb39795b74861183c713806"), 
    "categories" : [{ 
     "_id" : ObjectId("4fb39795b74861183c713807"), 
     "catagories" : [], 
     "standards" : [] 
    }], 
    "standards" : [] 
} 

は今、私はこれを実現するためにコードを書かれているが、問題はそれを参照していないが「1」である私は、オブジェクト内のカテゴリ配列にオブジェクト「0」を追加すると、そのように思わ代わりにそれをコピーします。これは、変更が行われた場合、元のオブジェクト "0"に行われるため、カテゴリ配列で作成されたコピーにプッシュされないため、少なくとも私にとって起こっていることであるからです。私はこれが私が探しているものをクリアすることを願っています。

+0

どのドライバを使用していますか?まるでOfficial 10genサポートドライバーを使用していないかのように見えます。何らかの理由? –

+0

'0'ドキュメントのIDは意図的に '1'ドキュメントの最初のカテゴリIDと同じですか? –

+0

私は今参照してください。これは自動的には起こりません。コピーは、MongoDBでこの動作を実現する唯一の方法です。率直に言って、この動作はデータベース内で自動的には起こりません。このようにする必要がある理由はありますか?このスキーマは本当に私にとって意味をなさない。 –

答えて

6

だから、これはあなたが探している実際の構造であるかのように、あなたの最新のコメントをもとに、それはそう:

{ 
    _id: ObjectId(), 

    name: "NamingConventions", 

    categories: [ 
     { 
      id: ObjectId(), 
      name: "Namespaces", 
      standards: [ 
       { 
        id: ObjectId(), 
        name: "TitleCased", 
        description: "Namespaces must be Title Cased." 
       }, 
       { 
        id: ObjectId(). 
        name: "NoAbbreviations", 
        description: "Namespaces must not use abbreviations." 
       } 
      ] 
     }, 
     { 
      id: ObjectId(), 
      name: "Variables", 
      standards: [ 
       { 
        id: ObjectId(), 
        name: "CamelCased", 
        description: "variables must be camel cased." 
       } 
      ] 
     } 
    ] 
} 

これが正しいと仮定すると、以下のあなたがこれらのいずれかを挿入する方法です。

var collection = db.GetCollection("some collection name"); 

var root = new BsonDocument(); 
root.Add("name", "NamingConventions"); 
var rootCategories = new BsonArray(); 
rootCategories.Add(new BsonDocument 
{ 
    { "id": ObjectId.GenerateNewId() }, 
    { "name", "Namespaces" }, 
    { "standards", new BsonArray() } 
}); 

root.Add("categories", rootCategories); 
//etc... 
collection.Save(root); 

希望があれば、私はあきらめます:)。

+0

オリジナルの投稿をご覧ください。これはまさに私が達成したいことですが、投稿したコードはこれをしていません。私はそれを実行させるために変更を行いましたが、リンクなしで2つのドキュメントを私に渡しています。 –

+0

サンプルをより完全に更新しました。文書を保持するためには、フィールドを文書に追加する必要があります。 –

+0

これはそれでした!私にこだわってくれてありがとう。私がしなければならなかった唯一のことは、コードを少し微調整することでした。 {"id":ObjectId.NewObjectId()}は動作しません。 "" _id "、ObjectId.GenerateNewId()} –

0

だから私はあなたが求めているものに混乱していると思います。 namingConventionsドキュメントを配列内に格納したいだけなら、それらのコレクションは必要ありません。代わりに、それらをbson配列に追加して格納するだけです。

var categoriesCollection = db.GetCollection<BsonDocument>("categories"); 

var category = new BsonDocument(); 
var namingConventions = new BsonArray(); 
namingConventions.Add(new BsonDocument("convention1", "value")); 

category.Add("naming_conventions", namingConventions); 

categoriesCollection.Insert(category); 

これは、カテゴリの新規文書を作成し、それは「convention1」という要素と「値」の値を持つことで、単一のドキュメントでnaming_conventionsと呼ばれるに配列を作成します。

+0

私の記事を参照してください私は別の編集を作った –

+0

私はそれを参照してください、どのようにあなたの質問に答えていないのですか?一意のidについては、Guidを使用し、ドキュメントを作成するときは、Guid.New()を使用してidフィールドに値を割り当てます。 –

+0

これは、配列内のドキュメントへの参照を作成しないためです。ドキュメントに変更を加えると、配列は同じままですが、IDはありません。 Guid.New()を使用する限り、より具体的にする必要があります。アイデアはありません。 –

0

また、あなたが達成しようとしていることはよくわかりません。おそらくJSON形式のサンプル文書を投稿した場合、それに合致する文書を書くためのC#コードを表示することができます。

また、スキーマについて議論したい場合は、C#ではなくJSONのコンテキストで行うほうが良いでしょう。スキーマが決まったら、C#でそのスキーマに文書を書き込む方法について説明します。 。

オリジナルの説明で正しく聞こえなかったことは、「そのコレクションは2つの配列が必要です」というステートメントでした。コレクションには文書のみを含めることができ、配列は含めることができません。ドキュメント自体には、必要に応じて配列を含めることができます。

+0

申し訳ありませんが、私はJSONで必要なものを書いています。 –

0
var filter = Builders<CollectionDefination>.Filter.Where(r => r._id== id); 
var data = Builders<CollectionDefination>.Update.Push(f=> 
    f.categories,categoriesObject); 
await _dbService.collection.UpdateOneAsync(filter,data); 

注:埋め込みドキュメントタイプ[カテゴリ]が配列であることを確認してください。

関連する問題