4

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

この時点で、私はこれを可能な限り最善の方法で行ったかどうかわからないので、このすべてについてのあらゆるアドバイスを受け入れます。

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" : []
}

これを実現するためのコードを記述しましたが、問題は、オブジェクト「0」をオブジェクト「1」のcategories配列に追加すると、参照を作成せず、代わりにコピーすることであるようです。変更が加えられた場合、元のオブジェクト「0」に変更が加えられ、categories配列で行われているコピーにプッシュされないため、これは原因ではありません。少なくとも、それが私に起こっていることです。これで私が探しているものが明らかになることを願っています。

4

4 に答える 4

7

したがって、最新のコメントに基づくと、これが探している実際の構造であるように見えます。

{
    _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);

そうでなければ、私はあきらめます:)。

于 2012-05-16T17:47:03.133 に答える
1

だから、私はあなたが何を求めているのか混乱していると思います。配列内に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」という要素と「value」の値を持つ単一のドキュメントを含むnaming_conventionsという配列が作成されます。

于 2012-05-11T20:07:09.997 に答える
0

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

または、スキーマについて話し合いたい場合は、C#ではなくJSONのコンテキストで行う方がよいでしょう。スキーマが決まったら、C#でそのスキーマにドキュメントを書き込む方法について話し合うことができます。

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

于 2012-05-16T02:31:15.767 に答える
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);

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

于 2018-01-29T02:36:35.653 に答える