4

我正在尝试使用 C# 将嵌套文档插入到 MongoDB 中。我有一个名为类别的集合。在该集合中必须存在具有 2 个数组、一个命名类别和一个命名标准的文档。在这些数组中必须存在具有自己 ID 的新文档,这些文档还包含上面列出的同名数组。以下是我到目前为止的内容,但我不确定如何进行。如果您查看代码,我想要做的是添加嵌套在类别文档中的类别数组下的“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”中的类别数组时,它不是在进行引用,而是在复制它。这不会发生,因为如果进行更改,将对原始对象“0”进行更改,因此它们不会被推送到类别数组中正在创建的副本,至少这是发生在我身上的事情。我希望这能清除我正在寻找的东西。

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

这将为一个类别创建一个新文档,在其中创建一个名为 Naming_conventions 的数组,其中包含一个名为“convention1”的元素和一个值为“value”的文档。

于 2012-05-11T20:07:09.997 回答
0

我也不太确定您要完成什么。也许如果您发布了一些 JSON 格式的示例文档,我们可以向您展示 C# 代码来编写与之匹配的文档。

或者,如果您想讨论您的架构,那么在 JSON 而不是 C# 的上下文中也可以更好地完成,并且一旦确定了架构,我们就可以讨论如何在 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);

注意:确保嵌入的文档类型 [Categories] 是数组。

于 2018-01-29T02:36:35.653 回答