Open wallleap opened 4 years ago
最近使用mongoose遇到一个问题,我的文档下面,包含一个子文档,这个子文档是一个数组。 数组中的每一个元素都是一个对象,其中一个键值对是日期。我需要将这个数组按照日期的顺序排序。 我想了个方法,就是把数组读取出来,然后排好顺序,替换掉原来的数据。但是这个方法感觉即麻烦又危险。 mongoose有没有对子文档的排序功能呢?
@oohirosama 可以使用 $push
和 $each
结合 $sort
来实现对子文档数组的排序。
假设你有一个包含子文档数组的父文档模型如下:
const parentSchema = new mongoose.Schema({
childDocs: [{
date: { type: Date },
// 其他字段...
}]
});
const ParentModel = mongoose.model('Parent', parentSchema);
现在,如果你想按照子文档数组中的日期字段进行排序,你可以使用以下方法:
ParentModel.updateOne(
{ _id: parentId }, // 根据父文档的ID进行查询
{ $push: { childDocs: { $each: [], $sort: { date: 1 } } } }, // 1表示升序,-1表示降序
function(err, result) {
if (err) {
// 处理错误
} else {
// 更新成功
}
}
);
在上面的示例中,$push
操作将子文档数组中的所有元素重新插入,使用 $each
将所有元素逐个添加到数组中,然后使用 $sort
按照日期字段对数组进行排序。
title: 在 Node 中使用非关系型数据库 MongoDB date: 2020-06-25 20:00 updated: 2020-06-25 20:00 cover: //cdn.wallleap.cn/img/pic/cover/202302dCEkfN.jpg category: 技术杂谈 tags:
后端 description: 在 Node 中使用非关系型数据库 MongoDB
MongoDB 是非关系型数据库的一种,相比起其他数据库而言,对前端开发者更友好
一、数据库简介
二、MongoDB 简介
安装 MongoDB
D:\Program Files\MongoDB\Server\4.2\bin
data/db
文件夹mongod
启动 MongoDB 服务器mongod --storageEngine=mmapv1
mongo
连接 mongodb,出现>
mongod --dbpath "D:\Program Files\MongoDB\Server\4.2\data\db --port 123"
mongod
启动mongo
来启动需要打开两个窗口,我们可以将 MongoDB 设置为系统服务,可以自动在后台启动,不需要每次都手动启动
C://data/
创建 db、log 目录D:\Program Files\MongoDB\Server\4.2
下添加一个配置文件mongod.cfg
,配置文件中添加内容sc.exe create MongoDB binPath="\"D:\Program Files\MongoDB\Server\4.2\bin\mongod.exe\" --service --config=\"D:\Program Files\MongoDB\Server\4.2\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
,创建 MongoDB 服务sc delete MongoDB
删除服务之后,重新开始配置三、MongoDB 的基本操作
在 MongoDB 中,数据库和集合都不需要我们手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在则会自动创建数据库和集合
1、基本命令
显示当前的所有数据库
show dbs
show databases
进入到指定的数据库中
use 数据库名
db 表示的是当前所处的数据库
db
显示数据库中所有的集合
show collections
2、数据库的 CRUD 操作
安装图形化工具:
MongodbManagerFree
或Studio-3T
向数据库中插入文档
db.<collection>.insert(doc)
向集合中插入一个或多个文档当我们向集合中插入文档时,如果没有给文档指定
_id
属性,则数据库会自动为文档添加_id
,该属性用来作为文档的唯一标识,也可以自己指定,如果我们指定了,数据库就不会添加了,如果自己指定_id
也必须确保它的唯一性db.<collection>.insertOne(doc)
插入一个文档对象db.<collection>.insertMany(doc)
插入多个文档对象注:MongoDB 中的文档的属性值也可以是一个文档,当一个文档的属性值是文档时,我们称这为内嵌文档。
MongoDB 支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档,可以通过
.
的形式来匹配。属性名必须用引号括起来查询
db.<collection>.find()
查询当前集合中的所有的文档find()
用来查询集合中所有符合条件的文档。在开发时,绝对不会执行不带条件的查询find()
可以接受一个对象作为条件参数{}
表示查询集合中所有的文档{字段名:值}
查询属性是指定值的文档,
连接$eq
等于$gt
、$gte
大于、大于等于$in
$lt
、$lte
$ne
$nin
$or
或find()
返回的是一个数组db.stus.find({}).count()
返回对象个数,一般用这个;db.stus.find({}).length()
db.stus.find().limit(10)
设置显示数据的上限,这里表示只显示前十条数据db.numbers.find().skip(10).limit(10)
skip()用于跳过指定数量的数据,这里会显示第11~20条数据。MongoDB 会自动调整 skip 和 limit 的位置,因此顺序随便db.<collectin>.findOne()
查询当前集合中符合条件的第一个文档findOne()
返回的是一个文档对象修改
db.<collectin>.update(查询条件,新对象[,配置选项])
$set
可以用来修改文档中的指定属性$push
用于向数据中添加一个新的元素$addT0Set
向数据中添加一个新元素,如果数组中已经存在该元素,则不会添加$unset
可以用来删除文档的指定属性db.<collectin>.updateMany(查询条件,新对象)
同时修改多个符合条件的文档db.<collectin>.updateOne(查询条件,新对象)
修改一个符合条件的文档db.<collectin>.replace(查询条件,新对象)
替换一个文档删除
db.<collectin>.remove()
db.<collectin>.deleteOne()
db.<collectin>.deleteMany()
db.collection.drop()
删除集合db.dropDatabase()
删除数据库四、文档之间的关系
一对一(One to One)
一对多(One to Many)/多对一(Many to One)
多对多(Many to Many)
五、sort 和投影
db.emp.find()
查询文档时,默认情况是按照_id
的值进行排列(升序)db.emp.find({}).sort({sal:1})
sort() 可以用来指定文档的排序的规则,sort() 需要传递一个队形来指定排序的规则1
表示升序-1
表示降序db.emp.find({}).sort(sal:1, empno:-1)
先按照 sal 升序排列,如果 sal 相同,按照 empno 降序排列db.emp.find({}, {ename:1})
在查询时,可以在第二个参数的位置来设置查询结果的投影db.emp.find({}, {ename: 1, _id: 0, sal: 1})
六、Mongoose 简介
1、简介
2、Mongoose 好处
3、新的对象
七、连接 MongoDB 数据库
npm i mongoose --save
var mongoose = require("mongoose")
mongoose.connect('mongodb://数据库IP地址:端口号/数据库名');
mongoose.connection.once("open",function(){})
数据库连接成功的事件mongoose.connection.once("close",function(){})
数据库断开的事件mongoose.disconnect()
八、Schema、Model 和 Document
有了 Model,就可以对数据库进行增删改查的操作了
Model.crate(doc(s), [callback])
doc(s)
可以是一个文档对象,也可以是一个文档对象的数组callback
当操作完成之后调用的回调函数Model.find(conditions, [projection], [options], [callback])
查询所有符合条件的文档 总会返回一个数组Model.findById(id, [projection], options), [callback]
根据文档的 id 属性查询文档Model.findOne([conditions], [projection], [options], [callback])
查询符合条件的第一个文档 总会返回一个具体的对象{}
对象,要的字段为 1,不要的为0""
字段名、不要的设为-
Model.update(conditions, doc, [options], [callback])
Model.updateMany(conditions, doc, [options], [callback])
Model.updateOne(conditions, doc, [options], [callback])
Model.replaceOne(conditions, doc, [options], [callback])
替换Model.remove(conditions, [callback])
Model.deleteOne(conditions, [callback])
Model.deleteMany(conditions, [callback])
Model.count(conditions, [callback])
Document 和集合中的文档一一对应,Document 是 Model 的实例,通过 Model 查询到结果都是 Document
Document 的方法
Model#save([options], [options.safe], [options.validateBeforeSave], [fn])
update(update, [options], [callback])
remove([callback])
get(name)
set(name, value)
id
_id
属性值toJSON()
toObject()
equals(doc)
isNew
isInit(path)
九、Mongoose 的模块化
定义一个模块,用来连接 MongoDB 数据库
定义一个 student 的模型,几个模型就可以创建几个 js 文件
其他地方引入
练习