使用C#将嵌套文档插入MongoDB

Joh*_*art 3 mongodb mongodb-.net-driver

我试图使用C#将嵌套文档插入MongoDB.我有一个名为类别的集合.在该集合中,必须存在具有2个数组,一个命名类别和一个命名标准的文档.在这些数组中必须存在具有自己的ID的新文档,这些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]);           
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为清楚起见,这就是我需要的:

我正在做的是建立一个编码标准网站.该公司希望将所有标准存储在MongoDB中的树中.一切都必须具有唯一的ID,以便在被查询为树时,它也可以自己查询.一个例子可能是:

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

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

现在我已经编写了代码来实现这一点,但问题似乎是当我将对象"0"添加到对象"1"中的类别数组时,它不是在引用而是复制它.这不会到期,因为如果进行了更改,它们将被设置为原始对象"0",因此它们不会被推送到类别数组中的副本,至少这是发生在我身上的事情.我希望这能清除我正在寻找的东西.

Cra*_*son 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."
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

假设这是正确的,那么下面是你如何插入其中一个:

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);
Run Code Online (Sandbox Code Playgroud)

希望有帮助,如果没有,我放弃:).