如何在解析中对对象数组运行查询

How to run query on array of objects in parse

本文关键字:对象 数组 运行 查询      更新时间:2023-09-26

我有一个关于用户位置解析的USER_LOCATION表。我将当前位置保存在单独的列中,并将其先前的位置保存在单独的列中。当前位置列为地理点类型,而先前位置列为数组类型。放置在先前位置的对象如下所示:

[
{"location":{"__type":"GeoPoint","latitude":12.3456789,"longitude":12.3456789},"time":"Fri, 22 Jan 2016 11:10:14 GMT"},
{"location":{"__type":"GeoPoint","latitude":12.3456789,"longitude":12.3456789},"time":"Thu, 21 Jan 2016 11:10:14 GMT"},
{"location":{"__type":"GeoPoint","latitude":12.3456789,"longitude":12.3456789},"time":"Wed, 20 Jan 2016 11:10:14 GMT"},
{"location":{"__type":"GeoPoint","latitude":12.3456789,"longitude":12.3456789},"time":"Sat, 23 Jan 2016 11:10:14 GMT"}
]

现在,我想显示所选用户在选定时间的位置的数据。 例如,如果用户选择了用户 A 并选择了 1 月 23 日的日期,那么我必须显示用户 A 在 1 月 23 日的"纬度":12.3456789,"经度":12.3456789。如何查询?

一个非常昂贵的选项是,我获取具有选定用户的表的所有对象,然后我循环数组对象并将时间与选定的值匹配,例如:

var matQuery = new Parse.Query(Parse.Object.extend("UserLocations"));
    matQuery.containedIn("user_id",request.param.userIds);
    matQuery.find({
        success: function(matchArray){
            for(var i=0;i<matchArray.length;i++){
               var prevLocArray = matchArray[i].get("PREV_LOCATION");
               for(var j=0;<prevLocArray.length;j++){
                   var obj = prevLocArray[j];
                   //match obj.time with provided time
               }
            }
        },error: function(err){
            response.success(err.message);
        }
    });

谁能指导我如何使用查询来做到这一点?

我认为

问题是:"如果我的_User有一系列位置/时间,我如何找到一组用户在特定时间的位置?

发布的代码与您获得的数据结构大致相同。 Parse.Query无法查询数组数据,除非请求是否存在完全匹配的元素。

两种选择是:(a)使用执行相同工作的云函数稍微改进它,但不浪费返回任何额外数据的网络工作,或者(b)通过创建"PrevLocation"类来规范化数据:

PrevLocation: "user" (pointer to _User), "date" (Date), "location" (GeoPoint)

查询用户是否在一组用户中,以及满足某个时间窗口(在目标日期的开始和结束之间)的日期。 这将在平台允许的范围内快速运行,并仅返回您寻找的数据。

请记住,如果需要,还可以include("user")该查询以获取完整的用户对象。