获取中...

-

Just a minute...

对象

安装使用

1
2
3
4
npm install leancloud-storage --save

# debug模式
DEBUG=leancloud* node src/leancloud.js

初始化

1
2
3
4
5
6
7
8
const AV = require("leancloud-storage");
const { Query, User, Object } = AV;

AV.init({
appId: "Xxx",
appKey: "2233",
serverURL: "https://plqzch1l.lc-cn-n1-shared.com",
});

新增

1
2
3
4
5
6
7
8
9
10
11
12
// extend 一个Class 相当于一张表
const Config = Object.extend("Config");
const config = new Config();
// 等价于
const config = new Object("Config");

config.set("title", "快递详情");
config.set("key", "book_length");
config.set("value", "11");
config.save().then((res) => {
console.log(res);
});

查询

1
2
3
4
5
6
7
const query = new Query("Config");
query.get("620e6d13b2ace54e35218427").then((row) => {
const key = row.get("key");
const value = row.get("value");
const title = row.get("title");
console.log(title, key, value);
});

修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 更新对象
const todo = AV.Object.createWithoutData("Todo", "582570f38ac247004f39c24b");
todo.set("content", "这周周会改到周三下午三点。");
todo.save();

// 查看哪些属性有尚未保存的修改
todo.dirtyKeys(); // ['content']
// 撤回
todo.revert(["content"]);

// 计数器
post.increment("likes", 1);
// 更新数组
// push
AV.Object.add("arrayKey", value);
// 去重添加,位置随机
AV.Object.addUnique("arrayKey", value);
// 从数组字段中删除指定对象的所有实例,如果是普通数组去掉多个,unique数组只去掉一个
AV.Object.remove("arrayKey", value);

删除

1
2
3
4
5
6
7
8
9
10
11
// 删除整个
const todo = AV.Object.createWithoutData("Todo", "582570f38ac247004f39c24b");
todo.destroy();

// 删除某个属性
const todo = AV.Object.createWithoutData("Todo", "582570f38ac247004f39c24b");

// priority 属性会被删除
todo.unset("priority");
// 保存对象
todo.save();

关联

1
2
3
4
5
6
7
8
9
10
11
const post = new AV.Object("Post");
post.set("title", "饿了……");
post.set("content", "中午去哪吃呢?");
// 创建 comment
const comment = new AV.Object("Comment");
comment.set("content", "当然是肯德基啦!");
// 将 post 设为 comment 的一个属性值
comment.set("parent", post);

// 保存 comment 会同时保存 post
comment.save();

查询

基础查询

1
2
3
4
5
6
const query = new AV.Query("Student");
// 查询lastName为Simith的
query.equalTo("lastName", "Smith");
query.find().then((students) => {
// students 是包含满足条件的 Student 对象的数组
});

条件查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 以下表示and  同时生效
// 不等于
query.notEqualTo("firstName", "Jack");
// 限制 age < 18
query.lessThan("age", 18);
// 限制 age <= 18
query.lessThanOrEqualTo("age", 18);
// 限制 age > 18
query.greaterThan("age", 18);
// 限制 age >= 18
query.greaterThanOrEqualTo("age", 18);

// 最多获取 10 条结果
query.limit(10);

query.first().then((todo) => {
// todo 是第一个满足条件的 Todo 对象
});
// 跳过前 20 条结果
query.skip(20);

// 分页,每页10个,跳过前20个,相当于第三页
const query = new AV.Query("Todo");
query.equalTo("priority", 2);
query.limit(10);
query.skip(20);

// 排序
// 按 createdAt 升序排列
query.ascending("createdAt");
// 按 createdAt 降序排列
query.descending("createdAt");

// 查找包含 'images' 的对象
query.exists("images");

// 查找不包含 'images' 的对象
query.doesNotExist("images");

// 第一个符合条件的title和content
const query = new AV.Query("Todo");
// 确定字段
query.select(["title", "content"]);
query.first().then((todo) => {
const title = todo.get("title"); // √
const content = todo.get("content"); // √
const notes = todo.get("notes"); // undefined
});

字符串查询

1
2
3
4
5
6
7
8
// 相当于 SQL 中的 title LIKE 'lunch%'
query.startsWith("title", "lunch");
// 相当于 SQL 中的 title LIKE '%lunch%'
query.contains("title", "lunch");

// 'title' 不包含 'ticket'(不区分大小写)
const regExp = new RegExp("^((?!ticket).)*$", "i");
query.matches("title", regExp);

数组查询

1
2
3
4
5
6
// 数组属性 tags 包含 工作
query.equalTo("tags", "工作");
// 数组属性长度为 3
query.sizeEqualTo("tags", 3);
// 所有数组属性 tags 同时包含 工作、销售 和 会议
query.containsAll("tags", ["工作", "销售", "会议"]);

统计数量

1
2
3
4
5
const query = new AV.Query("Todo");
query.equalTo("isComplete", true);
query.count().then((count) => {
console.log(`${count} 个 todo 已完成。`);
});

组合查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// or
const priorityQuery = new AV.Query("Todo");
priorityQuery.greaterThanOrEqualTo("priority", 3);
const isCompleteQuery = new AV.Query("Todo");
isCompleteQuery.equalTo("isComplete", true);
const query = AV.Query.or(priorityQuery, isCompleteQuery);
// and
const startDateQuery = new AV.Query("Todo");
startDateQuery.greaterThanOrEqualTo(
"createdAt",
new Date("2016-11-13 00:00:00")
);
const endDateQuery = new AV.Query("Todo");
endDateQuery.lessThan("createdAt", new Date("2016-12-03 00:00:00"));

const query = AV.Query.and(startDateQuery, endDateQuery);

注意事项

  • 不等于和不包含查询(无法使用索引)
  • 通配符在前面的字符串查询(无法使用索引)
  • 有条件的 count(需要扫描所有数据)
  • skip 跳过较多的行数(相当于需要先查出被跳过的那些行)
  • 无索引的排序(另外除非复合索引同时覆盖了查询和排序,否则只有其中一个能使用索引)
  • 无索引的查询(另外除非复合索引同时覆盖了所有条件,否则未覆盖到的条件无法使用索引,如果未覆盖的条件区分度较低将会扫描较多的数据)
相关文章
评论
分享
  • 利用微信小程序扫码授权

    微信小程序扫码授权背景想要使用微信扫码登录自己的网址,通过授权快速获取用户的昵称,头像功能由于没有企业认证账号,故只能通过微信小程序实现, 体验地址https://api.nnnnzs.cn/screen-demo.html?env=...

    利用微信小程序扫码授权
  • 强制加载element-dialog

    强制加载element-dialog背景123<el-dialog> <MyComponent /></el-dialog> 自己封装的组件 MyComponent ,放在了el-dialog里...

    强制加载element-dialog
  • leetcode-540-有序数组中的单一元素

    给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。 示例 1:输入: nums = [1...

    leetcode-540-有序数组中的单一元素
  • 1995.统计特殊四元组

    1995. 统计特殊四元组给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 :nums[a] + nums[b] + nums[c] == nums[d] ,且a...

    1995.统计特殊四元组
  • leetcode-1078.Bigram 分词

    给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 “first second third” 形式出现的情况,其中 second 紧随 first 出现,third 紧随 second 出现。对于每...

    leetcode-1078.Bigram 分词
  • leetcode-1705.吃苹果的最大数目

    有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,...

    leetcode-1705.吃苹果的最大数目
  • leetcode-1154.一年中的第几天

    1154. 一年中的第几天给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。请你计算并返回该日期是当年的第几天。通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 ...

    leetcode-1154.一年中的第几天
  • leetcode-475.供暖器

    冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。在加热器的加热半径范围内的每个房屋都可以获得供暖。现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋...

    leetcode-475.供暖器
  • leetcode-997.找到小镇的法官

    997. 找到小镇的法官在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。如果小镇的法官真的存在,那么:小镇的法官不相信任何人。每个人(除了小镇法官外)都信任小镇的法官。只有一个人同时满足...

    leetcode-997.找到小镇的法官
  • leetcode-3.无重复字符的最长子串

    3. 无重复字符的最长子串给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例1输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 123456789...

    leetcode-3.无重复字符的最长子串