猫鼬中嵌套文档的不同类型是啥?

Posted

技术标签:

【中文标题】猫鼬中嵌套文档的不同类型是啥?【英文标题】:What is difference type of nested document in mogoose?猫鼬中嵌套文档的不同类型是什么? 【发布时间】:2016-07-15 09:16:30 【问题描述】:

在调查猫鼬嵌套文档时,我发现它有多种方式。

/*
Collection : profiles


    "name":"terry",
    "address":
                "zipcode":135090,
                "city":"seoul",
                "state":"kyungki"
    ,
    "birthday":"1975-03-03",
    "meta":
            "company":"cloud consulting",
            "book":"architecture design"
            ,
    "image":
            "data":"xxxxxxx",
            "contentType":"image/png"
            

*/

var mongoose = require('mongoose');
var fs = require('fs');
mongoose.connect('mongodb://localhost:27017/mydb');

var addressSchema = new mongoose.Schema(
    zipcode : Number,
    city : String,
    state : String
);


var profileSchema = new mongoose.Schema(
    name : String,
    address : addressSchema,
    birthday : Date,
    meta : mongoose.Schema.Types.Mixed,
    image : 
        data : Buffer,
        contentsType : String
    
);

var Profile = mongoose.model('profiles',profileSchema);
var Address = mongoose.model('address',addressSchema);
var p = new Profile();

p.name = "terry";

// address
var a = new Address();
a.zipcode = 135090;
a.city = "youngin";
a.state = "Kyungki";
p.address = a;

// birthday
p.birthday = new Date(1970,05,10);

// meta
p.meta =  company : 'cloud consulting', book : 'architecture design';

// image
p.image.contentsType='image/png';
var buffer = fs.readFileSync('/Users/terry/nick.jpeg');
p.image.data = buffer;

p.save(function(err,silece)
    if(err)
        cosole.log(err);
        return;
    
    console.log(p);
);

如您所见,地址、元数据和图像字段是嵌套文档。对于地址字段,我创建了 addressSchema 字段和元字段,我在猫鼬中使用了混合类型。对于图像字段,我刚刚在 ProfileSchema 中定义了嵌套文档。

我使用了 3 种不同的方式,但我不知道它们之间有什么区别。

请您给我一个提示吗?提前谢谢。

【问题讨论】:

Mongoose subdocuments vs nested schema的可能重复 【参考方案1】:

根据db中保存的文档

 "_id" : ObjectId("56f8dc3de430d672036bf325"), "meta" :  "book" : "architecture design", "company" : "cloud consulting" , "birthday" : ISODate("1970-06-09T16:00:00Z"), "address" :  "_id" : ObjectId("56f8dc3de430d672036bf326"), "zipcode" : 135090, "city" : "youngin", "state" : "Kyungki" , "name" : "terry", "image" :  "data" : "test is here...", "contentsType" : "image/png" , "__v" : 0 

我们可以得到它们之间的区别,

address : addressSchema, 类似于sub-doc,另外一个_id 可以在address 字段中找到,"address" : "_id" : ObjectId("56f8dc3de430d672036bf326"), "zipcode" : 135090, "city" : "youngin", "state" : "Kyungki"

image : data : Buffer, contentsType : String是纯嵌套文档,image中只有定义的字段。

meta : mongoose.Schema.Types.Mixed,您可以定义一个“随心所欲”的 SchemaType,它的灵活性是以更难维护为代价的。参考doc。

【讨论】:

以上是关于猫鼬中嵌套文档的不同类型是啥?的主要内容,如果未能解决你的问题,请参考以下文章

是否有可能在猫鼬中有一系列替代子文档模式

使用数组过滤器更新多个嵌套数组在猫鼬中不起作用

如何从猫鼬中获取类型化的对象

在猫鼬中填充嵌套模型

在猫鼬中填充嵌套模型

更新猫鼬中的嵌套模式[重复]