安装引用
// 数据库
var mongoose = require('mongoose')
mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.connect("mongodb://127.0.0.1:27017/xyText", { useNewUrlParser: true });
表结构 Schema
// 优惠卷
const mongoose = require('mongoose')
var schema = mongoose.Schema;
var newSchema = new schema({
title: String, //标题
imgs: String, //活动封面
school: String, //校区
price: Number, //金额
tTimes: Number, //到期时间
userId: String, //用户id
strot: Boolean, // 状态值 0未使用 1使用
}, {
collection: "", // 状态值
timestamps: {
createdAt: 'created',
updatedAt: 'updated'
}
})
const Coupons = mongoose.model("Coupons", newSchema, "coupons")
module.exports = Coupons
添加静态方法
Schema.statics = {
fetch: function(cb) {
return this
.find({})
.sort('meta.updateAt')
.exec(cb)
},
findById: function(id, cb) {
return this
.findOne({
_id: id
})
.exec(cb)
}
}
model - 文档操作
- 查询 ```javascript model.find({}, callback);
//查询找到的第一个文档 model.findOne({}, callback);
//过滤查询 model.find({},field,callback);
//通过id查询 model.findById(‘obj._id’, callback);
//游标,过滤查询 model.findById(‘obj._id’, callback).sort(0).limit(10);
- 创建
```javascript
Model.create('obj', callback))
- 更新
Model.update('key', 'obj', callback)
// 查询id更新
Model.findByIdAndUpdate('id', 'obj', callback)
- 删除
Model.remove('key',callback);
更新修改器
- ‘$inc’增减修改器,只对数字有效.下面的实例: 找到 age=22的文档,修改文档的age值自增1
Model.update({
'age': 22
}, {
'$inc': {
'age': 1
}
});
- ‘$set’ 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.
Model.update({
'age': 22
}, {
'$set': {
'age': 'haha'
}
});
- ‘$unset’ 同上取反,删除一个键
Model.update({
'age': 22
}, {
'$unset': {
'age': 'haha'
}
});
数组修改器
- ‘$push’ 给一个键push一个数组成员,键不存在会创建
Model.update({
'age': 22
}, {
'$push': {
'array': 10
}
});
- ‘$addToSet’ 向数组中添加一个元素,如果存在就不添加
Model.update({
'age': 22
}, {
'$addToSet': {
'array': 10
}
});
- ‘$each’ 遍历数组, 和 $push 修改器配合可以插入多个值
Model.update({
'age': 22
}, {
'$push': {
'array': {
'$each': [1, 2, 3, 4, 5]
}
}
});
- ‘$pop’ 向数组中尾部删除一个元素
Model.update({
'age': 22
}, {
'$pop': {
'array': 1
}
});
- ‘$pull’ 向数组中删除指定元素
Model.update({
'age': 22
}, {
'$pull': {
'array': 10
}
});
条件查询
- “$lt” 小于
- “$lte” 小于等于
- “$gt” 大于
- “$gte” 大于等于
- “$ne” 不等于
Model.find({
"age": {
"$gte": 18,
"$lte": 30
}
});
或查询 or
- ‘$in’ 一个键对应多个值
- ‘$nin’ 同上取反, 一个键不对应指定值
- “$or” 多个条件匹配, 可以嵌套 $in 使用
- “$not” 同上取反, 查询与特定模式不匹配的文档
Model.find({
"age": {
"$in": [20, 21, 22.' haha']
}
});
//查询 age等于20或21或21或'haha'的文档
Model.find({
"$or": [{
"age": 18
}, {
"name": "xueyou"
}]
});
//查询 age等于18 或 name等于'xueyou' 的文档
类型查询
- null 能匹配自身和不存在的值, 想要匹配键的值 为null, 就要通过 “$exists” 条件判定键值已经存在“$exists” (表示是否存在的意思) ```javascript Model.find(“age”: { “$in”: [null], “exists”: true }, function(error, docs) { //查询所有不存在telephone属性的文档 }); //查询 age值为null的文档
Model.find({ name: { $exists: true } }, function(error, docs) { //查询所有存在name属性的文档 });
Model.find({ telephone: { $exists: false } }, function(error, docs) { //查询所有不存在telephone属性的文档 });
<a name="KkEHi"></a>
#### 正则表达式
- MongoDb 使用 Prel兼容的正则表达式库来匹配正则表达式
```javascript
find({
"name": /joe/i
})
//查询name为 joe 的文档, 并忽略大小写
find({
"name": /joe?/i
})
//查询匹配各种大小写组合
查询数组
Model.find({
"array": 10
});
//查询 array(数组类型)键中有10的文档, array : [1,2,3,4,5,10] 会匹配到
Model.find({
"array[5]": 10
});
//查询 array(数组类型)键中下标5对应的值是10, array : [1,2,3,4,5,10] 会匹配到
- ‘$all’ 匹配数组中多个元素
Model.find({
"array": [5, 10]
});
//查询 匹配array数组中 既有5又有10的文档
- ‘$size’ 匹配数组长度
Model.find({
"array": {
"$size": 3
}
});
//查询 匹配array数组长度为3 的文档
- ‘$slice’ 查询子集合返回
Model.find({
"array": {
"$skice": 10
}
});
//查询 匹配array数组的前10个元素
Model.find({
"array": {
"$skice": [5, 10]
}
});
//查询 匹配array数组的第5个到第10个元素
where
- 用它可以执行任意javacript语句作为查询的一部分,如果回调函数返回 true 文档就作为结果的一部分返回
find({
"$where": function() {
for (var x in this) {
//这个函数中的 this 就是文档
}
if (this.x !== null && this.y !== null) {
return this.x + this.y === 10 ? true : false;
} else {
return true;
}
}
})
//简化
find({
"$where": "this.x + this.y === 10"
})
find({
"$where": " function(){ return this.x + this.y ===10; } "
})
游标:
- limit(3) 限制返回结果的数量,
- skip(3) 跳过前3个文档,返回其余的
- sort( {“username”:1 , “age”:-1 } ) 排序 键对应文档的键名, 值代表排序方向, 1 升序, -1降序