【问题标题】:Embedding a document - MongoDB with Mongoose嵌入文档 - 带有 Mongoose 的 MongoDB
【发布时间】:2015-02-13 03:40:59
【问题描述】:

我是一名前端 iOS 开发人员,Mongoose 对我来说是新手。我正在尝试将父类别嵌入到子类别文档中。这是 obj-c 数据模型:

@interface CategorySub : MTLModel <MTLJSONSerializing>

@property (nonatomic) NSString* objectId;
@property (nonatomic) NSString* name;
@property (nonatomic) CategoryMain* categoryMain;

@end

这是 Mongoose CategorySub 架构定义:

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

还有 CategoryMain 模式,现在只是一个名称:

var CategoryMainSchema = new Schema({
  name: { type: String }
},
{
  collection: 'categories_main'
}
)

这是相关的create 代码:

 CategorySub.create({
        name : req.body.name,
        _category_main : req.body.category_main._id
 }, function(err, data){

我在 MongoUI 中获得的 CategorySub 文档之一是这样的:

如何更改架构定义和/或create 调用代码以将category_main 嵌入CategorySub 文档中?

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    看起来您的创建代码仅保存 _id 并且使用 dbref 作为子文档的对立面。这就是您只获取 id 而不是整个子文档的原因。

    CategorySubSchema
    .findOne({ name: 'YOUR NAME' })
    .populate('_category_main') // <--
    .exec(function (err, subdata) {
     if (err)
          console.log('The creator is %s', subdata.name);
     })
    

    请看这里:http://mongoosejs.com/docs/2.8.x/docs/populate.html

    还有另一种方法是使用子文档。在你的情况下,它看起来像这样。:

    var CategoryMainSchema = new Schema({
        name: { type: String },
        subCategories: [CategorySubSchema]
    });
    

    在创建案例中,您需要执行以下操作:

    var categoryMain = new CategoryMainSchema({name: "sub doc", subCategories:     [your  sub document] });
    

    请在此处查看文档:http://mongoosejs.com/docs/subdocs.html

    我希望这会有所帮助。

    【讨论】:

    • 明白了。所以嵌入使用subdocs 而引用只使用ids,对吗?
    • 是的,我相信它们各有利弊。它将满足您的需求。优点和缺点实际上取决于您的应用程序。如果您想快速阅读,我相信子文档会更快。但是,如果您想自己查询子文档,则可以使用 dbref ID 方式。
    • 如果你碰巧有时间...我有另一个简单的问题想出交叉引用模式...stackoverflow.com/questions/28486766/…
    • 我将在这里发表评论,因为我没有足够的声誉,无法对此发表评论。看起来您还没有定义 CategorySubSchema。这是在另一个文件的其他地方定义的吗?
    • 我更新了我的问题。我确实在其他地方定义了所有内容,只是无法连接所有内容。
    猜你喜欢
    • 2011-02-15
    • 2017-07-31
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    相关资源
    最近更新 更多