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

时间:2016-02-09 09:18:58

标签: javascript parse-platform

我在解析用户位置时有一个USER_LOCATION表。我将当前位置保存在单独的列中,并将其保留在单独的列中的先前位置。 “当前位置”列为GeoPoints类型,而“前一个位置”列为“阵列”类型。放置在先前位置的对象如下:

[
{"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并且选择了日期23 jan那么我必须在1月23日显示用户A在"纬度":12.3456789,"经度":12.3456789。如何查询是什么?

在w.r.t时间这么昂贵的一个选项是我获取已选择用户的表的所有对象然后循环数组对象并将时间与所选值匹配,如:

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);
        }
    });

任何人都可以指导我如何使用查询来做到这一点?

1 个答案:

答案 0 :(得分:0)

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

根据数据结构,发布的代码大约是你得到的。 Parse.Query无法查询数组数据,除非要求存在完全匹配的元素。

两个备选方案是:(a)使用执行相同工作的云功能稍微改进它,但不会浪费返回任何额外数据的网络工作,或(b)通过创建“PrevLocation”来规范化数据类:

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

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

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