我正在尝试使用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]);
}
}
}
为清楚起见,这就是我需要的:
我正在做的是建立一个编码标准网站。该公司希望将所有标准存储在MongoDB中的树中。一切都必须具有唯一的ID,以便在被查询为树时,它也可以自己查询。一个例子可能是:
/* 0 */
{
"_id" : ObjectId("4fb39795b74861183c713807"),
"catagories" : [],
"standards" : []
}
/* 1 */
{
"_id" : ObjectId("4fb39795b74861183c713806"),
"categories" : [{
"_id" : ObjectId("4fb39795b74861183c713807"),
"catagories" : [],
"standards" : []
}],
"standards" : []
}
现在我已经编写了代码来实现这一点,但问题似乎是当我将对象“0”添加到对象“1”中的categories数组时,它不会创建引用而是复制它。这不会到期,因为如果进行了更改,它们将被设置为原始对象“0”,因此它们不会被推送到类别数组中的副本,至少这是发生在我身上的事情。我希望这能清除我正在寻找的东西。
答案 0 :(得分: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);
希望有帮助,如果没有,我放弃:)。
答案 1 :(得分: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”的元素。
答案 2 :(得分:0)
我也不太清楚你想要完成什么。也许如果您以JSON格式发布了一些示例文档,我们可以向您展示C#代码来编写与之匹配的文档。
或者,如果您希望讨论您的模式,那么在JSON而不是C#的上下文中也可以做得更好,一旦架构已经确定,我们就可以讨论如何在C#中将文档写入该模式。
在原始描述中听起来不正确的一件事是声明“在该集合中必须存在2个数组”。集合只能包含文档,而不能包含数组。如果需要,文档本身可以包含数组。
答案 3 :(得分: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]是数组。