@cloudbase/node-sdk
Version:
tencent cloud base server sdk for node.js
620 lines (579 loc) • 16.2 kB
text/typescript
import * as assert from 'power-assert'
import tcb from '../../../src/index'
import * as config from '../../config.local'
import * as common from '../../common/index'
const app = tcb.init(config)
const db = app.database()
const _ = db.command
const $ = _.aggregate
const collName = 'test-projection'
let passagesCollection = null
const data = [
{ category: 'Web', tags: ['JavaScript', 'C#'], index: 0, tags2: [1, 2, 3] },
{ category: 'Web', tags: ['Go', 'C#'], index: 1, tags2: [1, 2, 3] },
{ category: 'luke', tags: ['Go'] },
{
category: 'Life',
tags: ['Go', 'Python', 'JavaScript'],
index: 2,
tags2: [1, 2, 3]
},
{
category: 'number',
tags: [1, 2, 3, 4, 5, 6, 7, 8, 9],
index: 3,
tags2: [1, 2, 3]
},
{
category: 'embedded',
tags: [{ value: 1 }, { value: 7 }],
index: 4,
tags2: [1, 2, 3]
},
{
category: 'float',
tags: ['Go', 'Python', 'JavaScript'],
index: 0.2,
arr: [
{ name: 'A', subObj: {} },
{ name: 'B', subObj: {} },
{ name: 'C', subObj: {} }
]
}
]
beforeEach(async () => {
passagesCollection = await common.safeCollection(db, collName)
const success = await passagesCollection.create(data)
assert.strictEqual(success, true)
})
afterEach(async () => {
const success = await passagesCollection.remove()
assert.strictEqual(success, true)
})
beforeAll(async () => {
const result = await db
.collection(collName)
.where({
_id: /.*/
})
.remove()
console.log(`before remove: ${result.deleted}`)
})
describe('operator', async () => {
it('addToSet', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
tags: _.addToSet('Java')
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert(result.data[0].tags.includes('Java'))
})
it('pullAll', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
tags: _.pullAll(['Go'])
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.deepStrictEqual(result.data[0].tags, ['Python', 'JavaScript'])
})
})
describe('pull', async () => {
it('pull', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
tags: _.pull('Go')
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.deepStrictEqual(result.data[0].tags, ['Python', 'JavaScript'])
})
it('pull with _.in', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
tags: _.pull(_.in(['Go', 'Python']))
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.deepStrictEqual(result.data[0].tags, ['JavaScript'])
})
it('pull多个字段', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
tags: _.pull(_.in(['Go', 'Python'])),
tags2: _.pull(1)
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.deepStrictEqual(result.data[0].tags, ['JavaScript'])
assert.deepStrictEqual(result.data[0].tags2, [2, 3])
})
it('pull with _.gte', async () => {
let result = await db
.collection(collName)
.where({
category: 'number'
})
.update({
tags: _.pull(_.gte(5))
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'number'
})
.get()
assert.deepStrictEqual(result.data[0].tags, [1, 2, 3, 4])
})
})
describe('all', async () => {
it('all', async () => {
let result = await db
.collection(collName)
.where({
tags: _.all(['Go'])
})
.get()
assert.strictEqual(result.data.length, 4)
})
})
describe('elemMatch', async () => {
it('Element Match', async () => {
let result = await db
.collection(collName)
.where({
tags: _.elemMatch(_.gt(2))
})
.get()
assert.strictEqual(result.data[0].category, 'number')
})
it('Element Match neq', async () => {
let result = await db
.collection(collName)
.where({
tags: _.elemMatch(_.neq('Go'))
})
.get()
const findOneTagItem = result.data.some(item => {
if (item.tags && item.tags.length === 1 && item.tags[0] === 'Go') {
return true
}
return false
})
// console.log('result:', JSON.stringify(result))
assert.strictEqual(findOneTagItem, false) // 匹配不到则正常
})
it('Array of Embedded Documents', async () => {
let result = await db
.collection(collName)
.where({
tags: _.elemMatch({
value: _.gt(0)
})
})
.get()
assert.strictEqual(result.data[0].category, 'embedded')
})
})
describe('size', async () => {
it('size', async () => {
let result = await db
.collection(collName)
.where({
tags: _.size(2)
})
.get()
assert.strictEqual(result.data[0].category, 'Web')
})
})
describe('exists', async () => {
it('exists', async () => {
let result = await db
.collection(collName)
.where({
tags: _.exists(true)
})
.get()
assert.strictEqual(result.data.length, data.length)
})
it('Array of Embedded Documents', async () => {
let result = await db
.collection(collName)
.where({
tags: _.elemMatch({
value: _.exists(true)
})
})
.get()
assert.strictEqual(result.data.length, 1)
assert.strictEqual(result.data[0].category, 'embedded')
})
})
describe('mod', async () => {
it('Array of Embedded Documents', async () => {
let result = await db
.collection(collName)
.where({
tags: _.elemMatch({
value: _.mod([4, 3])
})
})
.get()
assert.strictEqual(result.data.length, 1)
assert.strictEqual(result.data[0].category, 'embedded')
})
})
describe('rename', async () => {
it('rename', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
category: _.rename('cat')
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
cat: 'Life'
})
.get()
assert.strictEqual(result.data[0].cat, 'Life')
})
})
describe.skip('bit', async () => {
it('bit', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
index: _.bit({ xor: 5 })
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
console.log(result.data)
})
})
describe('max', async () => {
it('max', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
index: _.max(100)
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.strictEqual(result.data[0].index, 100)
})
it('min', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
index: _.min(0)
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.strictEqual(result.data[0].index, 0)
})
})
describe('aggregation $match with query', () => {
it('max', async () => {
let result = await db
.collection(collName)
.aggregate()
.match({
category: _.eq('Web')
})
.end()
console.log(result)
})
})
describe.skip('projection with elemMatch', () => {
it('普通查询', async () => {
let result = await db
.collection(collName)
.where({
category: /.*/
})
.field({
category: _.project.elemMatch({ value: 1 })
})
.get()
console.log(result)
})
it('普通查询', async () => {
let result = await db
.collection(collName)
.where({
category: /.*/
})
.field({
category: _.project.elemMatch({ value: _.gte(0) })
})
.get()
console.log(result)
})
})
describe('push', async () => {
it('push array', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
tags2: _.push([1, 2, 3])
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.deepStrictEqual(result.data[0].tags2, [1, 2, 3, 1, 2, 3])
})
it('push single item', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
tags2: _.push(1)
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.deepStrictEqual(result.data[0].tags2, [1, 2, 3, 1])
})
it('push multiple item', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
tags2: _.push(1, 2, 3)
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.deepStrictEqual(result.data[0].tags2, [1, 2, 3, 1, 2, 3])
})
it('push with options', async () => {
let result = await db
.collection(collName)
.where({
category: 'Life'
})
.update({
tags2: _.push({
each: [4, 5, 6],
sort: -1,
slice: 3
})
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'Life'
})
.get()
assert.deepStrictEqual(result.data[0].tags2, [6, 5, 4])
})
})
describe('not', async () => {
it('match with gt', async () => {
let result = await db
.collection(collName)
.where({
index: _.not(_.gt(1))
})
.get()
console.log(result)
assert.strictEqual(result.data.length, 4)
})
// not 目前还不支持正则
it.skip('match with regexp', async () => {
let result = await db
.collection(collName)
.where({
category: _.not(/www/)
})
.get()
console.log(result)
})
})
describe('expr', async () => {
it('with gte', async () => {
let result = await db
.collection(collName)
.where(_.expr($.gte(['$index', 3])))
.get()
assert.strictEqual(result.data.length, 2)
})
})
// 目前还不支持设置文本索引
describe.skip('text', async () => {
it('use string', async () => {
let result = await db
.collection(collName)
.where(_.text('life'))
.get()
console.log(result)
})
})
describe('jsonSchema', async () => {
it('where', async () => {
let result = await db
.collection(collName)
.where(
_.jsonSchema({
required: ['category']
})
)
.get()
assert.strictEqual(result.data.length, data.length)
})
it('nor', async () => {
let result = await db
.collection(collName)
.where(
_.nor([
_.jsonSchema({
required: ['category']
})
])
)
.get()
assert.strictEqual(result.data.length, 0)
})
})
describe('浮点数inc', async () => {
it('浮点数inc', async () => {
let result = await db
.collection(collName)
.where({
category: 'float'
})
.update({
index: _.inc(-0.05)
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'float'
})
.get()
assert.strictEqual(result.data[0].index, 0.2 - 0.05)
})
})
describe('remove数组内', async () => {
it('浮点数inc', async () => {
let result = await db
.collection(collName)
.where({
category: 'float'
})
.update({
arr: {
[0]: {
subObj: _.remove()
},
[1]: _.remove()
}
})
assert.strictEqual(result.updated, 1)
result = await db
.collection(collName)
.where({
category: 'float'
})
.get()
assert.strictEqual(result.data[0].arr[1], null)
assert.deepStrictEqual(result.data[0].arr[0], { name: 'A' })
})
})