node

node

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
javascript/jQuery

javascript/jQuery

一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。
MongoDB

MongoDB

MongoDB 是一个基于分布式文件存储的数据库
openstack

openstack

OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。
VUE

VUE

一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。
bootstrap

bootstrap

Bootstrap is the most popular HTML, CSS, and JS framework for developing responsive, mobile first projects on the web.
HTML

HTML

超文本标记语言,标准通用标记语言下的一个应用。
CSS/SASS/SCSS/Less

CSS/SASS/SCSS/Less

层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
PHP

PHP

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执
每天进步一点点

每天进步一点点

乌法把门的各累笑寂静
求职招聘

求职招聘

猎头招聘专用栏目
Python

Python

一种解释型、面向对象、动态数据类型的高级程序设计语言。

mongodb 用户地址模型

lopo1983 发表了文章 • 0 个评论 • 65 次浏览 • 2020-09-28 14:20 • 来自相关话题

module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const { logger, helper } = app.createAnonymousContext();
const {
objToQuery
} = helper;
const conn = app.mongooseDB.get('mp');
const AccountUserAddressSchema = new Schema({
// 默认地址
default_id: {
type: Schema.Types.ObjectId,
default: null
},
// 用户id
_uid: {
type: Schema.Types.ObjectId
},
// 标签
tags: {
type: Array,
default: ['家', '公司', '学校']
},
// 地址列表
address: [{
// 收货人姓名
userName: {
type: String,
required: true
},
// 邮编
postalCode: {
type: String
},
// 省市
provinceName: {
type: String,
required: true
},
// 市
cityName: {
type: String,
required: true
},
// 区/县
countyName: {
type: String,
required: true
},
// 详细地址
detailInfo: {
type: String,
required: true
},
// 联系电话
telNumber: {
type: String,
required: true
},
// 状态 [[0,'删除'],[1,'正常']]
status: {
type: Number,
default: 1
},
// 标签
tag: String,
// 添加时间
addTime: {
type: Date,
default: new Date()
},
deleteTime: Date
}]
});
AccountUserAddressSchema.statics = {
// 添加
addOne: async function(_uid, BODYS) {
const { is_default } = BODYS;
const MODEL = this.findOneAndUpdate({
_uid
}, {
$push: {
'address': {...BODYS }
},
// ...isDefault && { default_id: _id }
}, {
new: true,
fields: 'cars default_id -_id'
});
try {
const RBD = await MODEL;
return !!RBD
} catch (error) {
console.log(error)
}
},
// 更新地址
updateOne: async function(_uid, _id, BODYS) {
// const { isDefault } = BODYS;
// delete BODYS.isDefault;
const MODEL = this.findOneAndUpdate({
_uid,
'address._id': _id
}, {
$set: {...objToQuery(BODYS, 'address') }
}, {
fields: 'address default_id -_id'
});
try {
// 修改数据
const DATAS = await MODEL;
// 修改默认
// !!isDefault && await this.setDefault(_uid, isDefault, _id);
return !!DATAS.address.length ? BODYS : { code: 211, message: '更新失败' }
} catch (error) {
return error
}
},
// 列表
list: async function(_uid) {
const MODEL = this.aggregate([{
$match: {
_uid: mongoose.Types.ObjectId(_uid)
}
}, {
$unwind: '$address'
}, {
$match: {
'address.deleteTime': { $exists: false }
}
}, {
$addFields: {
'address.isDefault': {
$eq: ['$default_id', '$address._id']
}
}
}, {
$replaceRoot: { newRoot: "$address" }
}]);
// const MODEL = this.find({ _uid })
try {
const RBD = await MODEL;
return RBD.length ? RBD : await this.initAddress(_uid)
} catch (error) {
console.log(error)
}
},
// 删除一个
delOne: async function(_uid, _id) {
const MODEL = this.findOneAndUpdate({
_uid,
'address._id': _id
}, {
'address.$.status': 0,
'address.$.deleteTime': new Date(),
});
try {
const RBD = await MODEL;
return { _id }
} catch (error) {

}
},
// 初始化用地址
initAddress: async function(_uid) {
const MODEL = this.create({ _uid: mongoose.Types.ObjectId(_uid) });
try {
const DATAS = await MODEL;
return DATAS
} catch (error) {
console.log(error)
}
},
// 获取单一数据
getOne: async function(_uid, _id) {
const MODEL = this.aggregate([{
$match: { _uid: mongoose.Types.ObjectId(_uid) }
}, {
$unwind: '$address'
}, {
$project: {
address: 1,
_id: 1,
default_id: 1,
}
}, {
$addFields: {
'address.isDefault': {
$eq: [{ $toString: '$default_id' }, _id]
}
}
}, {
$match: {
'address.deleteTime': { $exists: false },
'address._id': mongoose.Types.ObjectId(_id),
}
}, {
$replaceRoot: { newRoot: "$address" }
}]);
try {
if (_id !== "default") {
const DATAS = await MODEL;
return DATAS.length ? DATAS[0] : {}
}
} catch (error) {
console.log(error)
return error
}
},
// 获取默认地址
getDefault: async function(_uid) {
const MODEL = this.findOne({ _uid }, {}, {
fields: 'default_id -_id'
});
try {
const { default_id } = await MODEL;
return await this.getOne(_uid, default_id)
} catch (error) {
console.log(error);
return error
}
},
// 設置默認
setDefault: async function(_uid, default_id) {
// const default_id = !!isDefaults ? _id : '';
const MODEL = this.findOneAndUpdate({ _uid }, { default_id });
try {
const MB = await MODEL;
return { default_id }
} catch (error) {
console.log(error);
return error
}
},
};
return conn.model('account_mp_user_address', AccountUserAddressSchema)
}/**
* @name mongoDB update数组参数
*
*/
objToQuery(OBJ, KEY) {
return Object.keys(OBJ).reduce((a, b) => {
a[`${KEY}.$.${b}`] = OBJ[b];
return a
}, {});
}, 查看全部
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const { logger, helper } = app.createAnonymousContext();
const {
objToQuery
} = helper;
const conn = app.mongooseDB.get('mp');
const AccountUserAddressSchema = new Schema({
// 默认地址
default_id: {
type: Schema.Types.ObjectId,
default: null
},
// 用户id
_uid: {
type: Schema.Types.ObjectId
},
// 标签
tags: {
type: Array,
default: ['家', '公司', '学校']
},
// 地址列表
address: [{
// 收货人姓名
userName: {
type: String,
required: true
},
// 邮编
postalCode: {
type: String
},
// 省市
provinceName: {
type: String,
required: true
},
// 市
cityName: {
type: String,
required: true
},
// 区/县
countyName: {
type: String,
required: true
},
// 详细地址
detailInfo: {
type: String,
required: true
},
// 联系电话
telNumber: {
type: String,
required: true
},
// 状态 [[0,'删除'],[1,'正常']]
status: {
type: Number,
default: 1
},
// 标签
tag: String,
// 添加时间
addTime: {
type: Date,
default: new Date()
},
deleteTime: Date
}]
});
AccountUserAddressSchema.statics = {
// 添加
addOne: async function(_uid, BODYS) {
const { is_default } = BODYS;
const MODEL = this.findOneAndUpdate({
_uid
}, {
$push: {
'address': {...BODYS }
},
// ...isDefault && { default_id: _id }
}, {
new: true,
fields: 'cars default_id -_id'
});
try {
const RBD = await MODEL;
return !!RBD
} catch (error) {
console.log(error)
}
},
// 更新地址
updateOne: async function(_uid, _id, BODYS) {
// const { isDefault } = BODYS;
// delete BODYS.isDefault;
const MODEL = this.findOneAndUpdate({
_uid,
'address._id': _id
}, {
$set: {...objToQuery(BODYS, 'address') }
}, {
fields: 'address default_id -_id'
});
try {
// 修改数据
const DATAS = await MODEL;
// 修改默认
// !!isDefault && await this.setDefault(_uid, isDefault, _id);
return !!DATAS.address.length ? BODYS : { code: 211, message: '更新失败' }
} catch (error) {
return error
}
},
// 列表
list: async function(_uid) {
const MODEL = this.aggregate([{
$match: {
_uid: mongoose.Types.ObjectId(_uid)
}
}, {
$unwind: '$address'
}, {
$match: {
'address.deleteTime': { $exists: false }
}
}, {
$addFields: {
'address.isDefault': {
$eq: ['$default_id', '$address._id']
}
}
}, {
$replaceRoot: { newRoot: "$address" }
}]);
// const MODEL = this.find({ _uid })
try {
const RBD = await MODEL;
return RBD.length ? RBD : await this.initAddress(_uid)
} catch (error) {
console.log(error)
}
},
// 删除一个
delOne: async function(_uid, _id) {
const MODEL = this.findOneAndUpdate({
_uid,
'address._id': _id
}, {
'address.$.status': 0,
'address.$.deleteTime': new Date(),
});
try {
const RBD = await MODEL;
return { _id }
} catch (error) {

}
},
// 初始化用地址
initAddress: async function(_uid) {
const MODEL = this.create({ _uid: mongoose.Types.ObjectId(_uid) });
try {
const DATAS = await MODEL;
return DATAS
} catch (error) {
console.log(error)
}
},
// 获取单一数据
getOne: async function(_uid, _id) {
const MODEL = this.aggregate([{
$match: { _uid: mongoose.Types.ObjectId(_uid) }
}, {
$unwind: '$address'
}, {
$project: {
address: 1,
_id: 1,
default_id: 1,
}
}, {
$addFields: {
'address.isDefault': {
$eq: [{ $toString: '$default_id' }, _id]
}
}
}, {
$match: {
'address.deleteTime': { $exists: false },
'address._id': mongoose.Types.ObjectId(_id),
}
}, {
$replaceRoot: { newRoot: "$address" }
}]);
try {
if (_id !== "default") {
const DATAS = await MODEL;
return DATAS.length ? DATAS[0] : {}
}
} catch (error) {
console.log(error)
return error
}
},
// 获取默认地址
getDefault: async function(_uid) {
const MODEL = this.findOne({ _uid }, {}, {
fields: 'default_id -_id'
});
try {
const { default_id } = await MODEL;
return await this.getOne(_uid, default_id)
} catch (error) {
console.log(error);
return error
}
},
// 設置默認
setDefault: async function(_uid, default_id) {
// const default_id = !!isDefaults ? _id : '';
const MODEL = this.findOneAndUpdate({ _uid }, { default_id });
try {
const MB = await MODEL;
return { default_id }
} catch (error) {
console.log(error);
return error
}
},
};
return conn.model('account_mp_user_address', AccountUserAddressSchema)
}
/**
* @name mongoDB update数组参数
*
*/
objToQuery(OBJ, KEY) {
return Object.keys(OBJ).reduce((a, b) => {
a[`${KEY}.$.${b}`] = OBJ[b];
return a
}, {});
},

mongodb 分页封装(传统分页)【2020-10-30 修正】

lopo1983 发表了文章 • 0 个评论 • 95 次浏览 • 2020-09-22 11:47 • 来自相关话题

const pageFn = ({ MATCH = [], OTHERMATCH = [], OTHERFACET = {}, FACET_KEY = {}, limit = 20, page = 1 } = {}) => {
return [{
$facet: {
'list': [
...MATCH,
{
$skip: (page - 1) * limit
},
{
$limit: limit * 1
},
...OTHERMATCH.length ? OTHERMATCH : []
],
'page': [
...MATCH,
{
$count: 'count'
}
],
...OTHERFACET
}
}, {
$project: {
list: {
$cond: [{ $eq: [{ $size: '$list' }, 0] },
[], '$list'
]
},
page: {
$cond: [{ $eq: [{ $size: '$page' }, 0] },
[{ count: 0 }], '$page'
]
},
count: 1,
...FACET_KEY
}
}, {
$unwind: '$page'
}, {
$addFields: {
'page.limit': limit * 1,
'page.page': page * 1
}
}]
};
module.exports = pageFn 查看全部
const pageFn = ({ MATCH = [], OTHERMATCH = [], OTHERFACET = {}, FACET_KEY = {}, limit = 20, page = 1 } = {}) => {
return [{
$facet: {
'list': [
...MATCH,
{
$skip: (page - 1) * limit
},
{
$limit: limit * 1
},
...OTHERMATCH.length ? OTHERMATCH : []
],
'page': [
...MATCH,
{
$count: 'count'
}
],
...OTHERFACET
}
}, {
$project: {
list: {
$cond: [{ $eq: [{ $size: '$list' }, 0] },
[], '$list'
]
},
page: {
$cond: [{ $eq: [{ $size: '$page' }, 0] },
[{ count: 0 }], '$page'
]
},
count: 1,
...FACET_KEY
}
}, {
$unwind: '$page'
}, {
$addFields: {
'page.limit': limit * 1,
'page.page': page * 1
}
}]
};
module.exports = pageFn

mongodb 聚合去重

lopo1983 发表了文章 • 0 个评论 • 537 次浏览 • 2019-06-05 19:20 • 来自相关话题

db.dbname.aggregate([
// _id 以你可以排除认定为重复kv
{
$group:{_id:{title:'$title'},count:{$sum:1},dups:{$addToSet:'$_id'}}
},
{
$match:{count:{$gt:1}}
}

]).forEach(function(it){

it.dups.shift();
db.dbname.remove({_id: {$in: it.dups}});

});
当然数据太大的时候配合 limit 来选取 查看全部
db.dbname.aggregate([
// _id 以你可以排除认定为重复kv
{
$group:{_id:{title:'$title'},count:{$sum:1},dups:{$addToSet:'$_id'}}
},
{
$match:{count:{$gt:1}}
}

]).forEach(function(it){

it.dups.shift();
db.dbname.remove({_id: {$in: it.dups}});

});

当然数据太大的时候配合 limit 来选取


MongoDB4.x 远程连接及用户名密码认证登陆配置

回复

lopo1983 发起了问题 • 1 人关注 • 0 个回复 • 863 次浏览 • 2019-06-02 13:23 • 来自相关话题

MongoDB 数据类型 转

lopo1983 发表了文章 • 0 个评论 • 516 次浏览 • 2018-12-26 16:46 • 来自相关话题

Double 1 双精度浮点数 - 此类型用于存储浮点值
String 2 字符串 - 这是用于存储数据的最常用的数据类型。MongoDB中的字符串必须为UTF-8
Object 3 对象 - 此数据类型用于嵌入式文档
Array 4 数组 - 此类型用于将数组或列表或多个值存储到一个键中
Binary data 5 二进制数据 - 此数据类型用于存储二进制数据
Undefined 6 已废弃
Object id 7 对象ID - 此数据类型用于存储文档的ID
Boolean 8 布尔类型 - 此类型用于存储布尔值(true / false)值
Date 9 日期 - 此数据类型用于以UNIX时间格式存储当前日期或时间。可以通过创建日期对象并将日,月,年的日期进行指定自己需要的日期时间
Null 10 Null - 此类型用于存储Null值
Regular 11 正则表达式 - 此数据类型用于存储正则表达式
JavaScript 13 代码 - 此数据类型用于将JavaScript代码存储到文档中
Symbol 14 符号 - 该数据类型与字符串相同;但是,通常保留用于使用特定符号类型的语言
JavaScript (with scope) 15 代码 - 此数据类型用于将带作用域的JavaScript代码存储到文档中
32-bit integer 16 32位整型 - 此类型用于存储数值
Timestamp 17 时间戳 - 当文档被修改或添加时,可以方便地进行录制
64-bit integer 18 64位整型 - 此类型用于存储数值
Min key 255 最小键 - 此类型用于将值与最小BSON元素进行比较
Max key 127 最大键 - 此类型用于将值与最大BSON元素进行比较
---------------------
作者:_抱歉打扰了
来源:CSDN
原文:https://blog.csdn.net/qq_33661 ... 16603
版权声明:本文为博主原创文章,转载请附上博文链接! 查看全部
Double    1     双精度浮点数 - 此类型用于存储浮点值
String 2 字符串 - 这是用于存储数据的最常用的数据类型。MongoDB中的字符串必须为UTF-8
Object 3 对象 - 此数据类型用于嵌入式文档
Array 4 数组 - 此类型用于将数组或列表或多个值存储到一个键中
Binary data 5 二进制数据 - 此数据类型用于存储二进制数据
Undefined 6 已废弃
Object id 7 对象ID - 此数据类型用于存储文档的ID
Boolean 8 布尔类型 - 此类型用于存储布尔值(true / false)值
Date 9 日期 - 此数据类型用于以UNIX时间格式存储当前日期或时间。可以通过创建日期对象并将日,月,年的日期进行指定自己需要的日期时间
Null 10 Null - 此类型用于存储Null值
Regular 11 正则表达式 - 此数据类型用于存储正则表达式
JavaScript 13 代码 - 此数据类型用于将JavaScript代码存储到文档中
Symbol 14 符号 - 该数据类型与字符串相同;但是,通常保留用于使用特定符号类型的语言
JavaScript (with scope) 15 代码 - 此数据类型用于将带作用域的JavaScript代码存储到文档中
32-bit integer 16 32位整型 - 此类型用于存储数值
Timestamp 17 时间戳 - 当文档被修改或添加时,可以方便地进行录制
64-bit integer 18 64位整型 - 此类型用于存储数值
Min key 255 最小键 - 此类型用于将值与最小BSON元素进行比较
Max key 127 最大键 - 此类型用于将值与最大BSON元素进行比较
---------------------
作者:_抱歉打扰了
来源:CSDN
原文:https://blog.csdn.net/qq_33661 ... 16603
版权声明:本文为博主原创文章,转载请附上博文链接!

MongoDB导入导出以及数据库备份

lopo1983 发表了文章 • 0 个评论 • 527 次浏览 • 2018-12-15 04:16 • 来自相关话题

导出

1.概念
mongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。
2、语法mongoexport -d dbname -c collectionname -o file --type json/csv -f field
参数说明:
-d :数据库名-c :collection名-o :输出的文件名--type : 输出的格式,默认为json-f :输出的字段,如果-type为csv,则需要加上-f "字段名"
示例mongoexport -d mongotest -c users -o /home/export/mongoDB/users.json --type json -f "_id,user_id,user_name,age,status"
-----------------------------------------------------------------------------------------------------------------

导入

1.语法mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
参数说明:
-d :数据库名-c :collection名--type :导入的格式默认json-f :导入的字段名--headerline :如果导入的格式是csv,则可以使用第一行的标题作为导入的字段--file :要导入的文件

2.示例mongoimport -d mongotest -c users --file /home/mongodump/articles.json --type json
-----------------------------------------------------------------------------------------------------------------

备份


1.语法mongodump -h dbhost -d dbname -o dbdirectory
参数说明:
-h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017-d: 需要备份的数据库实例,例如:test-o: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。
2.示例sudo rm -rf /home/momgodump/
sudo mkdir -p /home/momgodump
sudo mongodump -h 192.168.17.129:27017 -d itcast -o /home/mongodump/
-----------------------------------------------------------------------------------------------------------------


恢复

1.语法mongorestore -h dbhost -d dbname --dir dbdirectory
参数说明:
-h: MongoDB所在服务器地址-d: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2--dir: 备份数据所在位置,例如:/home/mongodump/itcast/--drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!
2.示例mongorestore -h 192.168.17.129:27017 -d itcast_restore --dir /home/mongodump/itcast/ 查看全部
导出

1.概念

mongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。


2、语法
mongoexport -d dbname -c collectionname -o file --type json/csv -f field

参数说明:
  • -d :数据库名
  • -c :collection名
  • -o :输出的文件名
  • --type : 输出的格式,默认为json
  • -f :输出的字段,如果-type为csv,则需要加上-f "字段名"

示例
mongoexport -d mongotest -c users -o /home/export/mongoDB/users.json --type json -f  "_id,user_id,user_name,age,status"

-----------------------------------------------------------------------------------------------------------------

导入

1.语法
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field

参数说明:
  • -d :数据库名
  • -c :collection名
  • --type :导入的格式默认json
  • -f :导入的字段名
  • --headerline :如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
  • --file :要导入的文件


2.示例
mongoimport -d mongotest -c users --file /home/mongodump/articles.json --type json

-----------------------------------------------------------------------------------------------------------------

备份


1.语法
mongodump -h dbhost -d dbname -o dbdirectory

参数说明:
  • -h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
  • -d: 需要备份的数据库实例,例如:test
  • -o: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。

2.示例
sudo rm -rf /home/momgodump/
sudo mkdir -p /home/momgodump
sudo mongodump -h 192.168.17.129:27017 -d itcast -o /home/mongodump/

-----------------------------------------------------------------------------------------------------------------


恢复

1.语法
mongorestore -h dbhost -d dbname --dir dbdirectory

参数说明:
  • -h: MongoDB所在服务器地址
  • -d: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
  • --dir: 备份数据所在位置,例如:/home/mongodump/itcast/
  • --drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!

2.示例
mongorestore -h 192.168.17.129:27017 -d itcast_restore --dir /home/mongodump/itcast/

mongo TTL 索引

lopo1983 发表了文章 • 0 个评论 • 596 次浏览 • 2018-10-15 23:48 • 来自相关话题

TTL索引是MongoDB中一种特殊的索引, 可以支持文档在一定时间之后自动过期删除,目前TTL索引只能在单字段上建立,
并且字段类型必须是date类型或者包含有date类型的数组(如果数组中包含多个date类型字段,则取最早时间为过期时间)
官网介绍链接:https://docs.mongodb.com/v3.2/core/index-ttl/
?
①TTL索引是单字段索引,混合索引不支持TTL,并且也会忽略expireAfterSeconds属性②在_id 主键上不能建立TTL索引③在capped collection中不能建立TTL索引,因为MongoDB不能从capped collection中删除文档④你不能使用createIndex()去更改已经存在的TTL索引的expireAfterSeconds值,如果想更改expireAfterSeconds,可以使用collMod命令,否则你只能删除索引,然后重建了⑤你不能在已有索引的字段上再创建TTL索引了,如果你想把非TTL索引改为TTL索引,那就只能删除重建索引了
?
?db.getCollection('smscodes').ensureIndex({'expiresIn':1},{"expireAfterSeconds":60*1})
MongoDB 权威指南的语法 错误 列为:expireAfterSecs 貌似新版的 应该为如上代码 查看全部
TTL索引是MongoDB中一种特殊的索引, 可以支持文档在一定时间之后自动过期删除,目前TTL索引只能在单字段上建立,
并且字段类型必须是date类型或者包含有date类型的数组(如果数组中包含多个date类型字段,则取最早时间为过期时间)

官网介绍链接:https://docs.mongodb.com/v3.2/core/index-ttl/


?
  • ①TTL索引是单字段索引,混合索引不支持TTL,并且也会忽略expireAfterSeconds属性
  • ②在_id 主键上不能建立TTL索引
  • ③在capped collection中不能建立TTL索引,因为MongoDB不能从capped collection中删除文档
  • ④你不能使用createIndex()去更改已经存在的TTL索引的expireAfterSeconds值,如果想更改expireAfterSeconds,可以使用collMod命令,否则你只能删除索引,然后重建了
  • ⑤你不能在已有索引的字段上再创建TTL索引了,如果你想把非TTL索引改为TTL索引,那就只能删除重建索引了

?
?
db.getCollection('smscodes').ensureIndex({'expiresIn':1},{"expireAfterSeconds":60*1})

MongoDB 权威指南的语法 错误 列为:expireAfterSecs 貌似新版的 应该为如上代码

mongo 插入多维数组 唯一 $ne+$push

lopo1983 发表了文章 • 0 个评论 • 492 次浏览 • 2018-09-28 18:22 • 来自相关话题

mongo $addToSet 用于处理普通数组不重复的问题
但是遇到 多维的就会出现问题
?
故只能通过$ne+$push的方式来解决
?
代码如下(egg2.x mongoose5.x)

Schemaconst AllPsListSchema = new Schema({
// 分类中文名称
psName: {
type: String,
required: [true, '服务名称不能为空'],
unique: true,
},
// 分类英文名称
psEnName: {
type: String,
},
// 服务状态 [0/停用,1/正常,2/维护,3/下线]
psState: {
type: Number,
default: 1
},
// 服务子类
psChild: [{
// 产品/服务名称
name: {
type: String,
required: [true, '服务/产品名称不能为空'],
unique: true
},
// 产品/服务英文名称
enName: {
type: String,
required: [true, '服务/产品英文名称不能为空'],
unique: true
},
// 服务状态 [0/停用,1/正常,2/维护,3/下线]
state: {
type: Number,
default: 1
},
// [0/删除,1/锁定,2/正常] 1/锁定意思为不可删除,系统保留
status: {
type: Number,
default: 2
}
}],
// [0:删除,1:锁定,2:正常] 1/锁定意思为不可删除,系统保留
status: {
type: Number,
default: 2
}
}, {
timestamps: {
createdAt: 'created',
updatedAt: 'updated'
}
})
statics
? creatPSChild: async function (_id, bodys) {
const result = await this.findOneAndUpdate({ _id, 'psChild.name': { $ne: bodys.name }, 'psChild.enName': { $ne: bodys.enName } }, {
$push: {
'psChild': bodys
}
});
return { data: result }
} 查看全部
mongo $addToSet 用于处理普通数组不重复的问题
但是遇到 多维的就会出现问题
?
故只能通过$ne+$push的方式来解决
?
代码如下(egg2.x mongoose5.x)

Schema
const AllPsListSchema = new Schema({
// 分类中文名称
psName: {
type: String,
required: [true, '服务名称不能为空'],
unique: true,
},
// 分类英文名称
psEnName: {
type: String,
},
// 服务状态 [0/停用,1/正常,2/维护,3/下线]
psState: {
type: Number,
default: 1
},
// 服务子类
psChild: [{
// 产品/服务名称
name: {
type: String,
required: [true, '服务/产品名称不能为空'],
unique: true
},
// 产品/服务英文名称
enName: {
type: String,
required: [true, '服务/产品英文名称不能为空'],
unique: true
},
// 服务状态 [0/停用,1/正常,2/维护,3/下线]
state: {
type: Number,
default: 1
},
// [0/删除,1/锁定,2/正常] 1/锁定意思为不可删除,系统保留
status: {
type: Number,
default: 2
}
}],
// [0:删除,1:锁定,2:正常] 1/锁定意思为不可删除,系统保留
status: {
type: Number,
default: 2
}
}, {
timestamps: {
createdAt: 'created',
updatedAt: 'updated'
}
})

statics
?
        creatPSChild: async function (_id, bodys) {
const result = await this.findOneAndUpdate({ _id, 'psChild.name': { $ne: bodys.name }, 'psChild.enName': { $ne: bodys.enName } }, {
$push: {
'psChild': bodys
}
});
return { data: result }
}

mongodb 备份还原

lopo1983 发表了文章 • 0 个评论 • 503 次浏览 • 2018-09-20 16:58 • 来自相关话题

备份
?mongodump -h dbhost -d dbname -o dbdir
?
上述语法中:-h MongDB所在服务器,可以附带指定端口号‘:port’

-d 需要备份的数据库实例

-o 备份数据存放的位置

如果以上参数都不指定,默认备份127.0.0.1端口号27017的所有数据库到当前的dump目录C:\Program Files\MongoDB\Server\4.0>mongodump
2018-09-20T16:55:53.312+0800 writing admin.system.version to
2018-09-20T16:55:53.356+0800 done dumping admin.system.version (1 document)
2018-09-20T16:55:53.357+0800 writing test.servicebills to
2018-09-20T16:55:53.357+0800 writing test.smslists to
2018-09-20T16:55:53.357+0800 writing test.companylogs to
2018-09-20T16:55:53.357+0800 writing test.smssigns to
2018-09-20T16:55:53.370+0800 done dumping test.companylogs (106 documents)
2018-09-20T16:55:53.370+0800 writing test.companies to
2018-09-20T16:55:53.374+0800 done dumping test.servicebills (347 documents)
2018-09-20T16:55:53.374+0800 writing test.smstemps to
2018-09-20T16:55:53.375+0800 done dumping test.companies (5 documents)
2018-09-20T16:55:53.376+0800 writing test.smsmailcodes to
2018-09-20T16:55:53.385+0800 done dumping test.smstemps (3 documents)
2018-09-20T16:55:53.385+0800 writing test.admins to
2018-09-20T16:55:53.399+0800 done dumping test.smsmailcodes (2 documents)
2018-09-20T16:55:53.399+0800 writing test.users to
2018-09-20T16:55:53.405+0800 done dumping test.admins (1 document)
2018-09-20T16:55:53.405+0800 writing test.complicenses to
2018-09-20T16:55:53.423+0800 done dumping test.users (1 document)
2018-09-20T16:55:53.423+0800 writing test.smscodes to
2018-09-20T16:55:53.429+0800 done dumping test.complicenses (1 document)
2018-09-20T16:55:53.429+0800 writing test.tokens to
2018-09-20T16:55:53.440+0800 done dumping test.smscodes (1 document)
2018-09-20T16:55:53.440+0800 writing test.zones to
2018-09-20T16:55:53.444+0800 done dumping test.zones (0 documents)
2018-09-20T16:55:53.444+0800 writing test.smshistories to
2018-09-20T16:55:53.447+0800 done dumping test.tokens (1 document)
2018-09-20T16:55:53.448+0800 done dumping test.smshistories (0 documents)
2018-09-20T16:55:54.392+0800 done dumping test.smssigns (15 documents)
2018-09-20T16:55:54.402+0800 done dumping test.smslists (202 documents)
?
还原
?mongorestore -h hostname:port -d dbname <path>
?一些重要的参数-h[:port] 指定MongoDB所在的服务器地址,默认为localhost

-d 需要恢复的数据库

--drop 恢复的时候先删除当前数据库,然后恢复备份,慎重操作

<path> 设置备份数据的位置,和下边的参数有冲突


--dir 指定备份的目录,和上边的参数有冲突
?C:\Program Files\MongoDB\Server\4.0>mongorestore -h IP:port --drop --dir ./dump
2018-09-20T16:57:17.847+0800 preparing collections to restore from
2018-09-20T16:57:17.898+0800 reading metadata for test.servicebills from dump\test\servicebills.metadata.json
2018-09-20T16:57:17.898+0800 reading metadata for test.companylogs from dump\test\companylogs.metadata.json
2018-09-20T16:57:17.899+0800 reading metadata for test.smslists from dump\test\smslists.metadata.json
2018-09-20T16:57:17.899+0800 reading metadata for test.smssigns from dump\test\smssigns.metadata.json
2018-09-20T16:57:17.900+0800 restoring test.servicebills from dump\test\servicebills.bson
2018-09-20T16:57:17.900+0800 restoring test.companylogs from dump\test\companylogs.bson
2018-09-20T16:57:17.900+0800 restoring test.smslists from dump\test\smslists.bson
2018-09-20T16:57:17.900+0800 restoring test.smssigns from dump\test\smssigns.bson 查看全部
备份
?
mongodump -h dbhost -d dbname -o dbdir

?
上述语法中:-h MongDB所在服务器,可以附带指定端口号‘:port’

-d 需要备份的数据库实例

-o 备份数据存放的位置

如果以上参数都不指定,默认备份127.0.0.1端口号27017的所有数据库到当前的dump目录
C:\Program Files\MongoDB\Server\4.0>mongodump
2018-09-20T16:55:53.312+0800 writing admin.system.version to
2018-09-20T16:55:53.356+0800 done dumping admin.system.version (1 document)
2018-09-20T16:55:53.357+0800 writing test.servicebills to
2018-09-20T16:55:53.357+0800 writing test.smslists to
2018-09-20T16:55:53.357+0800 writing test.companylogs to
2018-09-20T16:55:53.357+0800 writing test.smssigns to
2018-09-20T16:55:53.370+0800 done dumping test.companylogs (106 documents)
2018-09-20T16:55:53.370+0800 writing test.companies to
2018-09-20T16:55:53.374+0800 done dumping test.servicebills (347 documents)
2018-09-20T16:55:53.374+0800 writing test.smstemps to
2018-09-20T16:55:53.375+0800 done dumping test.companies (5 documents)
2018-09-20T16:55:53.376+0800 writing test.smsmailcodes to
2018-09-20T16:55:53.385+0800 done dumping test.smstemps (3 documents)
2018-09-20T16:55:53.385+0800 writing test.admins to
2018-09-20T16:55:53.399+0800 done dumping test.smsmailcodes (2 documents)
2018-09-20T16:55:53.399+0800 writing test.users to
2018-09-20T16:55:53.405+0800 done dumping test.admins (1 document)
2018-09-20T16:55:53.405+0800 writing test.complicenses to
2018-09-20T16:55:53.423+0800 done dumping test.users (1 document)
2018-09-20T16:55:53.423+0800 writing test.smscodes to
2018-09-20T16:55:53.429+0800 done dumping test.complicenses (1 document)
2018-09-20T16:55:53.429+0800 writing test.tokens to
2018-09-20T16:55:53.440+0800 done dumping test.smscodes (1 document)
2018-09-20T16:55:53.440+0800 writing test.zones to
2018-09-20T16:55:53.444+0800 done dumping test.zones (0 documents)
2018-09-20T16:55:53.444+0800 writing test.smshistories to
2018-09-20T16:55:53.447+0800 done dumping test.tokens (1 document)
2018-09-20T16:55:53.448+0800 done dumping test.smshistories (0 documents)
2018-09-20T16:55:54.392+0800 done dumping test.smssigns (15 documents)
2018-09-20T16:55:54.402+0800 done dumping test.smslists (202 documents)

?
还原
?
mongorestore -h hostname:port -d dbname <path>

?一些重要的参数-h[:port] 指定MongoDB所在的服务器地址,默认为localhost

-d 需要恢复的数据库

--drop 恢复的时候先删除当前数据库,然后恢复备份,慎重操作

<path> 设置备份数据的位置,和下边的参数有冲突


--dir 指定备份的目录,和上边的参数有冲突
?
C:\Program Files\MongoDB\Server\4.0>mongorestore -h IP:port --drop --dir ./dump
2018-09-20T16:57:17.847+0800 preparing collections to restore from
2018-09-20T16:57:17.898+0800 reading metadata for test.servicebills from dump\test\servicebills.metadata.json
2018-09-20T16:57:17.898+0800 reading metadata for test.companylogs from dump\test\companylogs.metadata.json
2018-09-20T16:57:17.899+0800 reading metadata for test.smslists from dump\test\smslists.metadata.json
2018-09-20T16:57:17.899+0800 reading metadata for test.smssigns from dump\test\smssigns.metadata.json
2018-09-20T16:57:17.900+0800 restoring test.servicebills from dump\test\servicebills.bson
2018-09-20T16:57:17.900+0800 restoring test.companylogs from dump\test\companylogs.bson
2018-09-20T16:57:17.900+0800 restoring test.smslists from dump\test\smslists.bson
2018-09-20T16:57:17.900+0800 restoring test.smssigns from dump\test\smssigns.bson

mongodb 数组操作

lopo1983 发表了文章 • 0 个评论 • 532 次浏览 • 2018-09-17 23:00 • 来自相关话题

1. 添加
db.test.update({'_id':id},{
$push:{'arr':{'name':'value'}}
})2.修改
db.test.update({'_id':id,arr.name:'name'},{
$set:{'arr.$.name':'newName'}
})3.删除(多维数组删除)
db.test.update({'_id':id},{
$pull:{arr:{'name':'value'}}
})
? 查看全部
1. 添加
db.test.update({'_id':id},{
$push:{'arr':{'name':'value'}}
})
2.修改
db.test.update({'_id':id,arr.name:'name'},{
$set:{'arr.$.name':'newName'}
})
3.删除(多维数组删除)
db.test.update({'_id':id},{
$pull:{arr:{'name':'value'}}
})

?