收藏
回答

云函数中两个集合关联条件查询怎么写?

table1 {

  {

   _id:1a2b,

    hit:2,

    point: [114,25],

 }

}
table2 {

  {

  _id:1a3d,

    tid:1a2b,

    get: 2,

 }

}

如上两个数据表集合,table2中的tid关联table1中的_id,我需要查询两种情况:

1、table2中满足hit>0,get>0,point在10公里范围内的随机3个结果;

2、table2中满足hit>0,get>0,point在10公里范围内的数量;

以上两种要怎么查询?聚合运算看不太懂,两个表中都有筛选条件的不知道怎么加上去

最后一次编辑于  2019-10-31
回答关注问题邀请回答
收藏

2 个回答

  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    2019-10-31

    // 云函数入口函数

    exports.main = async(event, context) => {

        const _ = db.command

        const $ = db.command.aggregate


        let getQuery = (point)=>{

            return db.collection('table1').aggregate()

            .geoNear({

                distanceField: 'distance',

                near: point, // db.Geo.Point对象,如 db.Geo.Point(113.3089506, 23.0968251),

                spherical: true,

                minDistance: 0,

                maxDistance: 10000, // 距离point 10公里范围内

                query: {

                    hit: $.gt(0), // hit > 0

                }

            })

            .lookup({

                from: 'table2',

                localField: '_id',

                foreignField: 'tid',

                as: 'list'

            })

            .unwind('$list')

            .addFields({

                tid: '$list.tid',

                get: '$list.get',

            })

            .match({

                get: $.gt(0) // get > 0

            })

            .project({

                _id: true,

                point: 1,

                hit: 1,

                get: 1,

                distance: 1

            })

        },

        // 统计记录数

        count = await getQuery(event.point).count('count').end(),

        // 随机3条记录

        rows = await getQuery(event.point).sample({size: 3}).end()

        

        return {

            count: count.hasOwnProperty('list') && count.list.length == 1 ? count.list[0].count || 0 : 0,

            list: rows.hasOwnProperty('list') ? rows.list : []

        }

    }

    ===========

    小程序端

    wx.cloud.callFunction({

        name: '云函数名称',

        data: {

            point: db.Geo.Point(113.3089506, 23.0968251)

        }

    }).then(res => console.log(res))

    .catch(err => console.error(err))



    2019-10-31
    有用 1
    回复 5
    • 阿白
      阿白
      2019-10-31
      谢谢,原来是这样写法,学习了
      2019-10-31
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2019-10-31回复阿白
      写这么多,不给个赞?,哈哈
      2019-10-31
      回复
    • 阿白
      阿白
      2019-10-31
      谢谢谢谢,可能还是没有学会,还得去看看文档
      2019-10-31
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2019-10-31回复阿白
      记得给 point 字段 加地理位置索引
      2019-10-31
      1
      回复
    • 阿白
      阿白
      2019-10-31
      有的
      2019-10-31
      回复
  • A🙃政
    A🙃政
    2019-10-31

    云开发不支持连表查询

    2019-10-31
    有用
    回复 4
    • 阿白
      阿白
      2019-10-31
      聚合运算是支持的,但是我只学会了其中一个表给条件,没学会两个表都给条件筛选
      2019-10-31
      回复
    • A🙃政
      A🙃政
      2019-10-31回复阿白
      聚合是支持,但是感觉你说的情况,云开发不支持联表;
      2019-10-31
      回复
    • 阿白
      阿白
      2019-10-31回复A🙃政
      db.collection('table1').aggregate()
      .geoNear({near: point,minDistance: 0,maxDistance: 8000,})
      .match({hit: _.gt(0)})
      .lookup({from: 'table2',localField: '_id',foreignField: 'tid',as: 'list',})
      .end()
      这样只是加了table1的条件,table2的条件我不知道能不能加?要怎么加?
      2019-10-31
      回复
    • A🙃政
      A🙃政
      2019-10-31回复阿白
      我回答不了你了--你要用另一个表的某个字段值作为表的查询依据。感觉要么先循环取出所有情况,然后再查一边
      2019-10-31
      回复
登录 后发表内容
问题标签