使用dbref做的不仅仅是存储`id`

时间:2015-02-13 18:13:50

标签: mongodb mongoose

我的Mongoose架构:

// set up the schema
var CategorySubSchema = new Schema({
  name: { type: String },
  _category_main : { type: String, ref: 'CategoryMain' }  

},

我的控制器代码:

CategorySub.create({

            name : req.body.name,
            _category_main : req.body.category_main

          }, function(err, data){

我的数据库中的条目:

{
    "_id": "54dd163434d78ae58f6b1a69",
    "name": "Snacks",
    "_category_main": "54dcf4a71dfecb4d86ddcb87",
    "__v": 0
  },

所以我使用了下划线,因为我跟随了一个例子。这对数据库意味着什么,还是只是引用的约定?

此外,不是在请求中传递整个JSON对象 - req.body.category_main,为什么不通过和id并将我的架构更改为此?:

 var CategorySubSchema = new Schema({
  name: { type: String },
  category_main_id : { type: String }  

},

1 个答案:

答案 0 :(得分:0)

简而言之,是的。

以下架构定义是Manual references的一个示例。

 var CategorySubSchema = new Schema({
  name: { type: String },
  category_main_id : { type: String }  
 }

其中,

  

将一个文档的_id字段另存为另一个文档   参考。然后您的应用程序可以运行第二个查询以返回   相关数据。这些参考文献简单且足以满足大多数用途   例。

在这种情况下,我们需要编写显式应用程序代码来获取引用的文档并解析引用。由于我们使用的驱动程序不知道所引用文档所在的集合,也不知道所引用文档所在的数据库。

如下所示定义架构时,这是存储引用文档的详细信息的示例。(Database references

var CategorySubSchema = new Schema({
  name: { type: String },
  _category_main : { type: String, ref: 'CategoryMain' }  
}
  

它们包括集合的name,在某些情况下还有。{1}}   数据库名称,以及_id字段的值。

这些细节允许各种驱动程序自己解析引用,因为引用文档的集合名称和数据库(可选)将包含在文档本身中,而不是我们编写显式应用程序代码来解析引用

  

所以我使用了下划线,因为我跟随了一个例子。这对数据库意味着什么,还是只是惯例   引用?

_id字段中使用下划线是一种有效的命名约定,但mongoDb并未明确提及用于解析引用的其他字段的命名约定。您可以使用任何其他字段名称,只要它符合this