在MongoDB中的文档之间创建依赖关系

时间:2019-09-23 15:03:09

标签: mongodb nosql

我想在集合中的某些文档之间创建依赖关系。 例如,我有文档A,并且我想在文档B中使用它的某些字段作为小节。因此,如果我更改文档A,则文档B中的字段也会更改。

以下是有关实际JSON的更好解释: 这是文件A

{ 
    "_id": ObjectId("1"),
    "value": 10,
    "name": "A_document_name",
    "owner": "some_owner"
}

这是文件B

{
    "_id": ObjectId("2"),
    "description": "some_description",
    "valid": true,
    "name": "some_name",
    "items": [
        {
            "id": "1",
            "name": "A_object_name"
        }
    ]
}

现在,我想发生的是,如果我更改文档A的名称,我希望看到它在文档B的项目部分中也发生了更改。当前,当我更改A的名称时,它仅在A中更改自创建以来,B保持不变。在Mongo中可以实现吗?如何在B中的items部分与A之间创建引用?我是否需要更改文档结构中的某些内容?

1 个答案:

答案 0 :(得分:4)

您需要使用mongoDB的$lookup

您将使用一个唯一的标识符来匹配文档, 例如: A文档为:

{ 
    "_id": ObjectId("1"),
    "b_id": ObjectId("2"),
    "value": 10,
    "name": "A_document_name",
    "owner": "some_owner"
}

B文档只是:

{
    "_id": ObjectId("2"),
    "description": "some_description",
    "valid": true,
    "name": "some_name"
}

然后,您将像这样进行汇总查询:

db.B.aggregate([
   {
     $lookup:
       {
         from: "A",  //The collection you're getting the items from
         localField: "_id", //The local field you're using to lookup 
         foreignField: "b_id", //The field the `A` document you're using to match
         as: "items" //The name of the field that will be populated with the results
       }
  }
])

aggregate可以做很多事情,花一点时间浏览文档。让我知道是否有帮助。