摘要:實現代碼最近在做一個項目涉及到的關聯查詢等等,之前做的,比較多,而用的都是比較簡單的存儲數據,簡單查詢等等。
mongoose-ref
實現代碼github
最近在做一個項目涉及到mongoose的關聯查詢等等,之前做的mysql,postgresql比較多,而mongoose用的都是比較簡單的存儲數據,簡單查詢等等。
剛開始涉及ref還是有點小暈的,查詢了相關資源,也可以模模糊糊做出來,但是會有各種報錯。痛下決心研究透徹點,晚上熬夜到2點終于有點小眉目了。
1. 首先建立了一個mongoose-ref項目node v8.5.0
mongodb
結合一個接口理解
結合promise-async-await
一般采用mvc模式,本文就直接在express里直接寫了
直接使用了express -e mongoose-ref
2.在routes/index里連接mongodb數據庫const mongoose = require("mongoose"); mongoose.connect("mongodb://localhost:27017/ref");3.建立4個模型,用戶:User,城市:City,省份:State,國家:Country
同時建立關聯user->city->state->country
const Schema = mongoose.Schema; const ObjectId = Schema.Types.ObjectId; const UserSchema = new Schema({ username: { type: String }, userpwd: { type: String }, userage: { type: Number }, city: { type: Schema.Types.ObjectId, ref: "City" }, }); const CitySchema = new Schema({ name: { type: String }, state: { type: Schema.Types.ObjectId, ref: "State" } }); const StateSchema = new Schema({ name: { type: String }, country: { type: Schema.Types.ObjectId, ref: "Country" } }); const CountrySchema = new Schema({ name: { type: String } }); const User = mongoose.model("User", UserSchema); const City = mongoose.model("City", CitySchema); const State = mongoose.model("State", StateSchema); const Country = mongoose.model("Country", CountrySchema);4.主要采用promise-async-async進行邏輯處理 首先創建一個user_getCountryList函數,如下代碼
const user_getCountryList = async function (req, res) { console.log("/v1/ref start -->" + JSON.stringify(req.body)); try { const respondData = { status: res.statusCode, data: {}, error: {} }; const username = req.body.username; const userpwd = req.body.userpwd; const userage = req.body.userage; const usercityname = req.body.usercityname; const userstatename = req.body.userstatename; const usercountryname = req.body.usercountryname; const userInfoCountry = await findUserCountry({ name: usercountryname }, usercountryname);//查看國家 const userInfoState = await findUserState({ name: userstatename }, userstatename);//查看州 const userInfoCity = await findUserCity({ name: usercityname }, usercityname);//查看城市 const userInfo = await findUser({ username: username, }, username,userpwd,userage);//查看用戶信息 const updateInfoUser = await updateUser({ _id: userInfo },userInfoCity);//更新用戶信息 const updateInfoCity = await updateCity({ _id: userInfoCity }, userInfoState);//更新城市信息 const updateInfoState = await updateState({ _id: userInfoState }, userInfoCountry);//更新州信息 return res.json(respondData); } catch (error) { //錯誤處理 console.log("userCity error -->" + JSON.stringify(error)); respondData.error = error; return res.json(respondData); } }
首先查看傳入的國家在country中有沒有,加入有,返回_id,沒有就創建傳入的國家名,并返回_id,查看findUserCountry函數對應的邏輯
const findUserCountry = async function (cnd, country) { console.log("findUserCountry start --> " + JSON.stringify(cnd)); return new Promise(function (resolve, reject) { Country.findOne(cnd, function (error, data) { console.log("findUserCountry findOne data --> " + JSON.stringify(data)); if (error) { return reject(error); } if (data) { return resolve(data._id); } else { const userCountry = new Country({ name: country }); userCountry.save(function (err, data) { if (err) { console.log("userCountry.save err-->" + JSON.stringify(err)); return reject(err); } console.log("userCountry-->" + JSON.stringify(data)); return resolve(data._id); }); } }); }) }
同理傳入的州,城市,用戶信息以同樣的方式返回_id
接下來就要進行關聯user->city->state->country通俗的說就是在User表中city保存City表中所需要的_id;也就是之前返回的_id這時就可以用到,可以參考updateUser函數
const updateUser = async function (cnd, cityid) { console.log("updateUser start --> " + JSON.stringify(cnd)); return new Promise(function (resolve, reject) { User.update(cnd, { $set: { city: cityid } }, function (error, data) { console.log("updateUser findOne data --> " + JSON.stringify(data)); if (error) { return reject(error); } return resolve(data); }); }) }
可以使用postman模擬數據,如圖:
這時就把City對應的_id寫進了User表中,可以查看表,如圖:
同理user->city->state->country數據都可以寫進不同的表中。
當傳入username 時,使用populate關聯查詢,可以查詢出這個人的所以信息
User.find({ username: user_name }) .populate("city") .exec(function (err, docs) { City.find({ _id: docs[0].city._id }) .populate("state") .exec(function (err, doc) { State.find({ _id: doc[0].state._id }) .populate("country") .exec(function (err, result) { const userInfo = {}; userInfo.username = docs[0].username; userInfo.userpwd = docs[0].userpwd; userInfo.userage = docs[0].userage; userInfo.usercity = doc[0].name; userInfo.userstate = result[0].name; userInfo.usercountry = result[0].country.name; respondData.data.push(userInfo); return res.json(respondData); }) }) });
使用postman模擬接口如下
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19110.html
摘要:是在環境下對進行便捷操作的對象模型工具因此,要使用,則必須安裝環境以及數據庫。使操作更簡單便捷。找到記錄,并且將遞增,返回后的為之前的。這個屬性很有用,對數字直接進行增減。,要返回的字段與的第二個參數一致。 Mongoose是在node.js環境下對mongodb進行便捷操作的對象模型工具 因此,要使用mongoose,則必須安裝node.js環境以及mongodb數據庫。mongoo...
摘要:使用可以實現在一個中填充其他的。表示關聯注意被關聯的的必須是和才有效。類型的時,格式如為表示不填充,為時表示填充。以鍵值對的形式表示。回調函數,接收兩個參數,錯誤和填充完的。參考數據庫的最簡單實現使用之原文鏈接 Mongoose 是 MongoDB 的 ODM(Object Document Mapper)。 什么是ODM? 其實和ORM(Object Relational Mapp...
摘要:使用可以實現在一個中填充其他的。表示關聯注意被關聯的的必須是和才有效。封裝了很多查詢的方法,使得對數據庫的操作變得簡單啦。這里分享一下方法用法。類型的時,格式如為表示不填充,為時表示填充。類型,可選,指定附加的查詢條件。 Mongoose 是 MongoDB 的 ODM(Object Document Mapper)。 什么是ODM? 其實和ORM(Object Relational...
摘要:本項目持續更新中,開源免費與各位愛好技術達人共勉,注現階段仍在開發中。。。。。 NodeJS+Express+MongoDb開發的個人博客 NodeJS+Express搭建個人博客-環境搭建(一)NodeJS+Express搭建個人博客-gulp自動化構建工具使用(二)NodeJS+Express搭建個人博客-Express+Mongodb組合架構介紹(三)NodeJS+Express...
摘要:在實際開發過程中發現,考試系統各個表集合都是需要關聯,這種非關系型數據庫,做起來反而麻煩了不少。數據中既有試卷的信息,也有很多題目。題目都屬于該試卷,改試卷又屬于當前登錄系統的老師即創建試卷的老師。 這是我畢業項目,從0到1,前后臺獨立開發完成。功能不多,在此記錄,溫故而知新!項目github地址:https://github.com/FinGet/Exam ,博客地址:https:/...
閱讀 2888·2021-11-17 09:33
閱讀 3661·2021-11-16 11:42
閱讀 3488·2021-10-26 09:50
閱讀 1316·2021-09-22 15:49
閱讀 3045·2021-08-10 09:44
閱讀 3669·2019-08-29 18:36
閱讀 3924·2019-08-29 16:43
閱讀 2207·2019-08-29 14:10