uni-app中uni-cloud查询数组对象问题

uni-app中uni-cloud查询数组对象问题

查询timeList的dayTime在某个区间的数据

有如下结构的数据:

{
    "title": "新的",
    "updateTime": 1621824309966,
    "timeList": [
        {
            "dayTime": 1621826110175,
            "type": 1,
            "status": 1
        },
        {
            "dayTime": 1621872000000,
            "type": 3,
            "status": 1
        }
    ]
}

我想查询timeListdayTime在某个区间的数据时用以下方式找不出数据:

let wheres = {
    timeList: dbCmd.elemMatch({
        dayTime: dbCmd.and(dbCmd.gt(1621785600000), dbCmd.lt(1621871999999)),
        status: dbCmd.eq(1)
    })
}
const data = await collection.where(wheres).get()

使用mongodb的语法就可以有数据:

timeList: {
    $elemMatch: {
        dayTime: { $lt: endTime, $gt: startTime },
        status: 1
    }
}

更多关于uni-app中uni-cloud查询数组对象问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

已确认Bug,感谢反馈

更多关于uni-app中uni-cloud查询数组对象问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在uniCloud的JQL查询中,使用dbCmd.elemMatch是正确的思路,但语法需要调整。你的查询条件应该这样写:

let wheres = {
  timeList: dbCmd.elemMatch({
    dayTime: dbCmd.and(dbCmd.gt(1621785600000), dbCmd.lt(1621871999999)),
    status: dbCmd.eq(1)
  })
}

问题可能出在时间值的比较上。确保你的时间戳是数值类型而非字符串。如果问题依旧,可以尝试以下替代方案:

  1. 使用聚合查询:
const res = await collection.aggregate()
  .match({
    timeList: dbCmd.elemMatch({
      dayTime: dbCmd.and(dbCmd.gt(1621785600000), dbCmd.lt(1621871999999)),
      status: dbCmd.eq(1)
    })
  })
  .end()
  1. 如果只需要匹配单个条件,可以简化为:
let wheres = {
  "timeList.dayTime": dbCmd.and(dbCmd.gt(1621785600000), dbCmd.lt(1621871999999)),
  "timeList.status": dbCmd.eq(1)
}
回到顶部