在做查询的时候,大部分情况都需要做一些条件查询。在云开发提供的API中,我们可以通过db.command来实现。以下这些指令的操作:
command.eq:
查询筛选条件,表示字段等于某个值。eq指令接受一个字面量 (literal),可以是number,boolean,string, object,array, Date。
比如想要获取作者是北京日报的所有文章:
// 第一种方式,直接通过指定的数据查询:
db.collection("article").where({
author: "北京日报"
});
// 第二种方式,通过eq指令查询:
const _ = db.command;
db.collection("article").where({
author: _.eq("北京日报")
});
command.eq与指定数据还是有区别的,比如以下两个作用是不一样的:
// 这种写法表示匹配 stat.publishYear == 2018 且 stat.language == 'zh-CN'
db.collection('articles').where({
author: {
name: "今日头条",
age: 18
}
})
// 这种写法表示 stat 对象等于 { publishYear: 2018, language: 'zh-CN' }
const _ = db.command
db.collection('articles').where({
stat: _.eq({
name: "今日头条",
age: 18
})
})
command.neq:
表示字段不等于某个值,和db.command.eq相反。
command.lt:
表示小于某个值。比如查找小于2019/1/1 00:00:00发布的文章:
const _ = db.command;
db.collection("article").where({
pub_date: _.lt(new Date("2019/1/1 00:00:00"))
});
command.lte:
表示小于或者等于某个值。与command.lt类似。
command.gt:
表示大于某个值。与command.lt类似。
command.gte:
表示大于或者等于某个值。与command.lte类似。
command.in:
查询筛选条件,表示字段的值需在给定的数组内。比如查找北京日报和今日头条两个作者发表的文章:
const _ = db.command;
db.collection("article").where({
author: _.in(['北京日报','今日头条'])
});
command.nin:
查询筛选条件,表示字段的值需不在给定的数组内。与command.int类似。
command.and:
查询指令,用于表示逻辑 “与” 的关系,表示需同时满足多个查询筛选条件。比如获取发表在2019/1/1 00:00:00和2019/1/1 23:59:59之间的所有文章:
const _ = db.command;
// 普通调用:
db.collection("article").where({
pub_date: _.and(_.gte(new Date("2019/1/1 00:00:00")),_.lte(new Date("2019/1/1 23:59:59")))
});
// 链式调用:
db.collection("article").where({
pub_date: _.gte(new Date("2019/1/1 00:00:00")).and(_.lte(new Date("2019/1/1 23:59:59")))
});
command.or:
查询指令,用于表示逻辑 “或” 的关系,表示需同时满足多个查询筛选条件。或指令有两种用法,一是可以进行字段值的 “或” 操作,二是也可以进行跨字段的 “或” 操作。
一个字段的或操作(比如获取时间在2019/1/1 00:00:00前或者2019/1/1 23:59:59后发表的文章):
const _ = db.command;
db.collection("article").where({
pub_date: _.or(_.lt("2019/1/1 00:00:00"),_gt(new Date("2019/1/1 23:59:59")))
});
跨字段或操作(比如想要获取时间在2019/1/1前,或者是标题中包含今日头条的文章):
const _ = db.command;
db.collection("article").where(
_.or([{
pub_date: _.lt(new Date("2019/1/1 00:00:00"))
},{
title: /今日头条/
}])
);
更新指令:
command.set:
更新指令。用于设定字段等于指定值。比如以下是一个文章的数据:
{
"title": "abc",
"content": "111",
"author": {
"name": "今日头条",
"age": 18
}
}
如果我想将这个文章中的author变成{“name”:“今日头条”},那么通过传统的方式是无法实现的:
db.collection("article").doc("id").update({
data: {
author: {
"name": "今日头条"
}
}
})
上面这种方式,只是将author.name设置为今日头条,并没有将author的值设置为{name:“今日头条”},也就是说,age:18这个值依然在author中存在。这时候就需要通过set来实现了。示例代码如下:
const _ = db.command;
db.collection("article").doc("id").update({
data: {
author: _.set({
"name": "今日头条"
})
}
})
command.remove:
更新指令。用于表示删除某个字段。比如我们想将author这个字段删除,那么就可以调用这个方法。示例代码如下:
const _ = db.command;
db.collection("article").doc("id").update({
data: {
author: _.remove()
}
})
command.inc:
更新指令。用于指示字段自增某个值,这是个原子操作,使用这个操作指令而不是先读数据、再加、再写回的好处是:
1. 原子性:多个用户同时写,对数据库来说都是将字段加一,不会有后来者覆写前者的情况。
2. 减少一次网络请求:不需先读再写。
比如article这个集合中的一条数据有一个read_count字段,想给这个字段加1,那么可以使用以下方式实现:
const _ = db.command
db.collection('article').doc('id').update({
data: {
read_count: _.inc(1)
}
})
command.mul:
自乘指令,跟command.inc一样。
command.push:
更新指令,对一个值为数组的字段,往数组尾部添加一个或多个值。或字段原为空,则创建该字段并设数组为传入值。
比如要给article集合中的某条数据添加标签,那么可以使用以下方式来实现:
const _ = db.command
db.collection('article').doc('id').update({
data: {
tags: _.push(['新闻'])
}
})
command.pop:
更新指令,对一个值为数组的字段,将数组尾部元素删除。
command.shift:
更新指令,对一个值为数组的字段,将数组头部元素删除。
command.unshift:
更新指令,对一个值为数组的字段,往数组头部添加一个或多个值。或字段原为空,则创建该字段并设数组为传入值。