当另一个集合发生更改时,MongoDB动态更新集合

Nic*_*asR 6 mongodb-.net-driver

我使用Robomongo创建了两个集合:collection_Project包含这样的文档

{
"_id" : ObjectId("5537ba643a45781cc8912d8f"),

"_Name" : "ProjectName",
"_Guid" : LUUID("16cf098a-fead-9d44-9dc9-f0bf7fb5b60f"),
"_Obj" : [ 
 ]
}
Run Code Online (Sandbox Code Playgroud)

我用这个函数创建的

public static void CreateProject(string ProjectName)
    {
        MongoClient client = new MongoClient("mongodb://localhost/TestCreationMongo");
        var db = client.GetServer().GetDatabase("TestMongo");
        var collection = db.GetCollection("collection_Project");
        var project = new Project
        {
            _Name = ProjectName,
            _Guid = Guid.NewGuid(),
            _Obj = new List<c_Object>()
        };
        collection.Insert(project);
    }
Run Code Online (Sandbox Code Playgroud)

和collection_Object包含这样的文档

{
  "_id" : ObjectId("5537ba6c3a45781cc8912d90"),
  "AssociatedProject" : "ProjectName",
  "_Guid" : LUUID("d0a5565d-a0aa-7a4a-9683-b86f1c1de188"),
  "First" : 42,
  "Second" : 1000
}
Run Code Online (Sandbox Code Playgroud)

我用这个函数创建的

 public static void CreateObject(c_Object ToAdd)
    {
        MongoClient client = new MongoClient("mongodb://localhost/TestCreationMongo");
        var db = client.GetServer().GetDatabase("TestMongo");
        var collection = db.GetCollection("collection_Object");

        collection.Insert(ToAdd);
Run Code Online (Sandbox Code Playgroud)

我用该函数更新了collection_Project的文档

 public static void AddObjToProject(c_Object ObjToAdd, string AssociatedProject)
    {
        MongoClient client = new MongoClient("mongodb://localhost/TestCreationMongo");
        var db = client.GetServer().GetDatabase("TestMongo");
        var collection = db.GetCollection<Project>("collection_Project");

        var query = Query.EQ("_Name", AssociatedProject);
        var update = Update.AddToSetWrapped<c_Object>("_Obj", ObjToAdd);

        collection.Update(query, update);
    }
Run Code Online (Sandbox Code Playgroud)

以便collection_Project中的文档看起来像这样

{
"_id" : ObjectId("5537ba643a45781cc8912d8f"),
"_Name" : "ProjectName",
"_Guid" : LUUID("16cf098a-fead-9d44-9dc9-f0bf7fb5b60f"),
"_Obj" : [ 
    {
        "_id" : ObjectId("5537ba6c3a45781cc8912d90"),
        "AssociatedProject" : "ProjectName",
        "_Guid" : LUUID("d0a5565d-a0aa-7a4a-9683-b86f1c1de188"),
        "First" : 42,
        "Second" : 1000
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我是否可以仅在collection_Object中更新文档并查看collection_Project中的更改?

我试着这样做

 public static void UpdateObject(c_Object ToUpdate)
    {
        MongoClient client = new MongoClient("mongodb://localhost/TestCreationMongo");
        var db = client.GetServer().GetDatabase("TestMongo");
        var collection = db.GetCollection("collection_Object");

        var query = Query.EQ("_Guid", ToUpdate._Guid);
        var update = Update.Replace<c_Object>(ToUpdate);
        collection.Update(query, update);
    }
Run Code Online (Sandbox Code Playgroud)

但我的collection_Project没有改变.

你有什么线索吗?

Sam*_*att 2

看起来您正在将“Object”文档嵌入到“Project”文档中,这可能没问题,但这种方法消除了对单独的 collection_Object 集合的需要。也就是说,collection_Object 是多余的,因为每个对象(不仅仅是引用)实际上都存储在您实现的项目文档中。

有关使用嵌入文档的信息,请参阅文档。

或者,您可以使用文档参考

最佳使用方法取决于您的具体用例。