国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[轉(zhuǎn)]mongodb中的populate方法

ranwu / 1662人閱讀

摘要:使用可以實現(xiàn)在一個中填充其他的。表示關(guān)聯(lián)注意被關(guān)聯(lián)的的必須是和才有效。封裝了很多查詢的方法,使得對數(shù)據(jù)庫的操作變得簡單啦。這里分享一下方法用法。類型的時,格式如為表示不填充,為時表示填充。類型,可選,指定附加的查詢條件。

Mongoose 是 MongoDB 的 ODM(Object Document Mapper)。

什么是ODM? 其實和ORM(Object Relational Mapper)是同類型的工具。都是將數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)化為代碼對象的庫,使用轉(zhuǎn)化后的對象可以直接對數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行CRUD(增刪改查)。

MongoDB 是文檔型數(shù)據(jù)庫(Document Database),不是關(guān)系型數(shù)據(jù)庫(RelationalDatabase)。而Mongoose可以將 MongonDB 數(shù)據(jù)庫存儲的文檔(documents)轉(zhuǎn)化為 javascript對象,然后可以直接進(jìn)行數(shù)據(jù)的增刪改查。

因為MongoDB是文檔型數(shù)據(jù)庫,所以它沒有關(guān)系型數(shù)據(jù)庫joins(數(shù)據(jù)庫的兩張表通過"外鍵",建立連接關(guān)系。) 特性。也就是在建立數(shù)據(jù)的關(guān)聯(lián)時會比較麻煩。為了解決這個問題,Mongoose封裝了一個Population功能。使用Population可以實現(xiàn)在一個 document 中填充其他 collection(s)document(s)

在定義Schema的時候,如果設(shè)置某個 field 關(guān)聯(lián)另一個Schema,那么在獲取 document 的時候就可以使用 Population 功能通過關(guān)聯(lián)Schema的 field 找到關(guān)聯(lián)的另一個 document,并且用被關(guān)聯(lián) document 的內(nèi)容替換掉原來關(guān)聯(lián)字段(field)的內(nèi)容。

接下來分享下:Query#populate Model#populate Document#populate的用法

先建立三個SchemaModel:

var mongoose = require("mongoose");
var Schema   = mongoose.Schema;

var UserSchema = new Schema({
    name  : { type: String, unique: true },
    posts : [{ type: Schema.Types.ObjectId, ref: "Post" }]
});
var User = mongoose.model("User", UserSchema);

var PostSchema = new Schema({
    poster   : { type: Schema.Types.ObjectId, ref: "User" },
    comments : [{ type: Schema.Types.ObjectId, ref: "Comment" }],
    title    : String,
    content  : String
});
var Post = mongoose.model("Post", PostSchema);

var CommentSchema = new Schema({
    post      : { type: Schema.Types.ObjectId, ref: "Post" },
    commenter : { type: Schema.Types.ObjectId, ref: "User" },
    content   : String
});
var Comment = mongoose.model("Comment", CommentSchema);

在上述的例子中,創(chuàng)建了三個 Models:UserPost,Comment。
User 的屬性 post`,對應(yīng)是一個 ObjectId 的數(shù)組。ref表示關(guān)聯(lián)Post(注意: 被關(guān)聯(lián)的model的 type 必須是ObjectId, Number, String, 和 Buffer 才有效)。
Post的屬性 poster 和 comments 分別關(guān)聯(lián)User和Comment。
Comment的屬性 post 和 commenter 分別關(guān)聯(lián)Post和User。
三個 Models 的關(guān)系:一個 user--has many-->post。一個 post--has one-->user,has many-->comment。一個 comment--has one-->post 和 user。
創(chuàng)建一些數(shù)據(jù)到數(shù)據(jù)庫:

// 連接數(shù)據(jù)庫
mongoose.connect("mongodb://localhost/population-test", function (err){
    if (err) throw err;
    createData();
});

function createData() {

    var userIds    = [new ObjectId, new ObjectId, new ObjectId];
    var postIds    = [new ObjectId, new ObjectId, new ObjectId];
    var commentIds = [new ObjectId, new ObjectId, new ObjectId];

    var users    = [];
    var posts    = [];
    var comments = [];

    users.push({
        _id   : userIds[0],
        name  : "aikin",
        posts : [postIds[0]]
    });
    users.push({
        _id   : userIds[1],
        name  : "luna",
        posts : [postIds[1]]
    });
    users.push({
        _id   : userIds[2],
        name  : "luajin",
        posts : [postIds[2]]
    });

    posts.push({
        _id      : postIds[0],
        title    : "post-by-aikin",
        poster   : userIds[0],
        comments : [commentIds[0]]
    });
    posts.push({
        _id      : postIds[1],
        title    : "post-by-luna",
        poster   : userIds[1],
        comments : [commentIds[1]]
    });
    posts.push({
        _id      : postIds[2],
        title    : "post-by-luajin",
        poster   : userIds[2],
        comments : [commentIds[2]]
    });

    comments.push({
        _id       : commentIds[0],
        content   : "comment-by-luna",
        commenter : userIds[1],
        post      : postIds[0]
    });
    comments.push({
        _id       : commentIds[1],
        content   : "comment-by-luajin",
        commenter : userIds[2],
        post      : postIds[1]
    });
    comments.push({
        _id       : commentIds[2],
        content   : "comment-by-aikin",
        commenter : userIds[1],
        post      : postIds[2]
    });

    User.create(users, function(err, docs) {
        Post.create(posts, function(err, docs) {
            Comment.create(comments, function(err, docs) {
            });
        });
    });
}

數(shù)據(jù)的準(zhǔn)備就緒后,接下來就是探索populate方法:

Query#populate

什么Query? Query(查詢),可以快速和簡單的從MongooDB查找出相應(yīng)的 document(s)。 Mongoose封裝了很多查詢的方法,使得對數(shù)據(jù)庫的操作變得簡單啦。這里分享一下populate方法用法。

語法: Query.populate(path, [select], [model], [match], [options])

參數(shù):
path
  類型StringObject
  String類型的時, 指定要填充的關(guān)聯(lián)字段,要填充多個關(guān)聯(lián)字段可以以空格分隔。
  Object類型的時,就是把 populate 的參數(shù)封裝到一個對象里。當(dāng)然也可以是個數(shù)組。下面的例子中將會實現(xiàn)。

select
  類型ObjectString,可選,指定填充document 中的哪些字段。
  Object類型的時,格式如:{name: 1, _id: 0},為0表示不填充,為1時表示填充。
  String類型的時,格式如:"name -_id",用空格分隔字段,在字段名前加上-表示不填充。詳細(xì)語法介紹query-select

model
  類型Model,可選,指定關(guān)聯(lián)字段的 model,如果沒有指定就會使用Schema的ref。
match
  類型Object,可選,指定附加的查詢條件。
options
  類型Object,可選,指定附加的其他查詢選項,如排序以及條數(shù)限制等等。

填充Userposts字段:

User.findOne({name: "aikin"})
    .exec(function(err, doc) {

        var opts = [{
            path   : "posts",
            select : "title"
        }];

        doc.populate(opts, function(err, populatedDoc) {
            console.log(populatedDoc.posts[0].title);  // post-by-aikin
        });
    });

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/18935.html

相關(guān)文章

  • Mongoose 之 Population 使用

    摘要:使用可以實現(xiàn)在一個中填充其他的。表示關(guān)聯(lián)注意被關(guān)聯(lián)的的必須是和才有效。類型的時,格式如為表示不填充,為時表示填充。以鍵值對的形式表示?;卣{(diào)函數(shù),接收兩個參數(shù),錯誤和填充完的。參考數(shù)據(jù)庫的最簡單實現(xiàn)使用之原文鏈接 Mongoose 是 MongoDB 的 ODM(Object Document Mapper)。 什么是ODM? 其實和ORM(Object Relational Mapp...

    timger 評論0 收藏0
  • Mongoose簡要API

    摘要:是在環(huán)境下對進(jìn)行便捷操作的對象模型工具因此,要使用,則必須安裝環(huán)境以及數(shù)據(jù)庫。使操作更簡單便捷。找到記錄,并且將遞增,返回后的為之前的。這個屬性很有用,對數(shù)字直接進(jìn)行增減。,要返回的字段與的第二個參數(shù)一致。 Mongoose是在node.js環(huán)境下對mongodb進(jìn)行便捷操作的對象模型工具 因此,要使用mongoose,則必須安裝node.js環(huán)境以及mongodb數(shù)據(jù)庫。mongoo...

    王巖威 評論0 收藏0
  • 在線考試系統(tǒng)(vue2 + elementui + express4 + MongoDB

    摘要:在實際開發(fā)過程中發(fā)現(xiàn),考試系統(tǒng)各個表集合都是需要關(guān)聯(lián),這種非關(guān)系型數(shù)據(jù)庫,做起來反而麻煩了不少。數(shù)據(jù)中既有試卷的信息,也有很多題目。題目都屬于該試卷,改試卷又屬于當(dāng)前登錄系統(tǒng)的老師即創(chuàng)建試卷的老師。 這是我畢業(yè)項目,從0到1,前后臺獨立開發(fā)完成。功能不多,在此記錄,溫故而知新!項目github地址:https://github.com/FinGet/Exam ,博客地址:https:/...

    warmcheng 評論0 收藏0
  • 聊聊畢業(yè)設(shè)計系列 --- 系統(tǒng)實現(xiàn)

    摘要:七牛云接入本系統(tǒng)的圖片,音視頻是放在七牛云,所以需要接入七牛云。在服務(wù)端通過接口請求來獲取七牛云上傳,客戶端獲取到七牛云,通過不同方案將帶上。 效果展示 showImg(https://user-gold-cdn.xitu.io/2018/8/26/16576a709bd02f5f?w=1409&h=521&f=gif&s=30128195); showImg(https://user...

    null1145 評論0 收藏0
  • 聊聊畢業(yè)設(shè)計系列 --- 系統(tǒng)實現(xiàn)

    摘要:七牛云接入本系統(tǒng)的圖片,音視頻是放在七牛云,所以需要接入七牛云。在服務(wù)端通過接口請求來獲取七牛云上傳,客戶端獲取到七牛云,通過不同方案將帶上。 效果展示 showImg(https://user-gold-cdn.xitu.io/2018/8/26/16576a709bd02f5f?w=1409&h=521&f=gif&s=30128195); showImg(https://user...

    qpal 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<