Parse.com 查询包含在指针数组中
Parse.com Query containedIn Array of Pointers
原问题
我正在尝试查询 allFriends
中的 ID 与 Creator
中的 ID 匹配的所有实例。 allFriends
是来自先前查询的 ID 数组。使用指针数组 containedIn
的正确语法是什么。
所有朋友:
["1EGomEr0Tk", "iMJbVrPfGG", "DVOwabZkaQ", "zhvd8mAdhl"]
代码:
query.containedIn("Creator", {
__type: "Pointer",
className: "User",
objectId: allFriends
})
错误:
code: 102
error: "$in requires an array"
更新#1
我发现我需要将 allFriends
ID 数组转换为指针映射。但是 _.map
被计算为未定义。
代码:
var pointers = _.map(allFriends, function(item_id) {
var pointer = new Parse.Object("allFriends");
pointer.id = item_id;
return pointer;
});
query.containedIn("Creator", pointers);
错误:
Uncaught ReferenceError: map is not defined
Parse 允许您定义指针列或数组列。数组是标量类型(数字、字符串等)的有序集合,也可以是指针数组。
指针
获取和设置指针时,操作数是一个PFObject。换句话说,对于 setter:
myObject.set("somePointerCol", someOtherObject);
其中 someOtherObject 是一个 PFObject,可能是一个空的,只定义了一个 ID(正如您在编辑中正确指出的那样)。对于 getter:
myQuery.first().then(function(myObject) {
var someOtherObject = myObject.get("somePointerCol");
});
someOtherObject 将是一个空的 PFObject,仅设置了其 objectId。如果您还想获取所引用的对象,请像这样限定您的查询:
myQuery.include("somePointerCol");
// someOtherPointerCol on the retrieved object will contain a complete, fetched object
数组和指针数组
PFObject 为数组提供了几个方法,您可以使用 add
和 addUnique
添加到数组,并使用 remove 从数组中删除。优雅的部分是当数组是指针数组时,这些方法可以很容易地应用。
myObject.addUnique("arrayOfPointersCol", someOtherObject);
// or...
myObject.remove("arrayOfPointersCol", someOtherObject);
最后,PFQuery 相当透明地处理数组。要查找 arrayOfPointersCol 中包含 PFObject 的任何 myObject,请使用 equalTo,就好像它只是一个值一样。
myQuery.equalTo("arrayOfPointersCol", someOtherObject);
// if you have only an id, say someId, then
var SomeOtherClass = Parse.Object.extend("SomeOtherClass");
var someOtherObject = new SomeOtherClass();
someOtherObject.id = someId;
myQuery.equalTo("arrayOfPointersCol", someOtherObject);
与非数组指针类似,您可以急切地获取该数组中的所有元素:
myQuery.include("arrayOfPointersCol"); // but be careful, keep array lengths short
下划线
最后,与数组或指针的想法无关,您当然可以映射一个对象 ID 数组,将它们转换为一个指针对象数组。您发布的代码看起来不错,但它依赖于 the underscore library——这是一个非常有用的库,提供了 _.map 等许多功能。
如果您的 "Creator" 列是 Pointer<_User> 类型并且您的 allFriends
数组是用户 ID 数组,那么您需要做的是:
从 allFriends
:
创建一个 Pointer<_User> 对象数组
var pointers = _.map(allFriends, function(friendId) {
var pointer = new Parse.User();
pointer.id = friendId;
return pointer;
});
一旦你有了一个 Pointer<_User> 数组,你就可以比较你的列:
query.containedIn('Creator', pointers);
你非常接近,只是创建正确类型的指针的问题。
可能有点晚了,但您也可以使用方法 createWithoutData
从 ID 构建对象
如果你想要多指针列,只需创建数组列并用_User 对象填充它。结果看起来像这样,它实际上是指针数组:
[{"__type":"Pointer","className":"_User","objectId":"kIg9Kzzls9"},
{"__type":"Pointer","className":"_User","objectId":"TGCBZm52zW"},
{"__type":"Pointer","className":"_User","objectId":"YfGT9GvJs6"}]
使用 include 获取查询中的完整对象也可以,它是一个指针数组。
原问题
我正在尝试查询 allFriends
中的 ID 与 Creator
中的 ID 匹配的所有实例。 allFriends
是来自先前查询的 ID 数组。使用指针数组 containedIn
的正确语法是什么。
所有朋友:
["1EGomEr0Tk", "iMJbVrPfGG", "DVOwabZkaQ", "zhvd8mAdhl"]
代码:
query.containedIn("Creator", {
__type: "Pointer",
className: "User",
objectId: allFriends
})
错误:
code: 102
error: "$in requires an array"
更新#1
我发现我需要将 allFriends
ID 数组转换为指针映射。但是 _.map
被计算为未定义。
代码:
var pointers = _.map(allFriends, function(item_id) {
var pointer = new Parse.Object("allFriends");
pointer.id = item_id;
return pointer;
});
query.containedIn("Creator", pointers);
错误:
Uncaught ReferenceError: map is not defined
Parse 允许您定义指针列或数组列。数组是标量类型(数字、字符串等)的有序集合,也可以是指针数组。
指针
获取和设置指针时,操作数是一个PFObject。换句话说,对于 setter:
myObject.set("somePointerCol", someOtherObject);
其中 someOtherObject 是一个 PFObject,可能是一个空的,只定义了一个 ID(正如您在编辑中正确指出的那样)。对于 getter:
myQuery.first().then(function(myObject) {
var someOtherObject = myObject.get("somePointerCol");
});
someOtherObject 将是一个空的 PFObject,仅设置了其 objectId。如果您还想获取所引用的对象,请像这样限定您的查询:
myQuery.include("somePointerCol");
// someOtherPointerCol on the retrieved object will contain a complete, fetched object
数组和指针数组
PFObject 为数组提供了几个方法,您可以使用 add
和 addUnique
添加到数组,并使用 remove 从数组中删除。优雅的部分是当数组是指针数组时,这些方法可以很容易地应用。
myObject.addUnique("arrayOfPointersCol", someOtherObject);
// or...
myObject.remove("arrayOfPointersCol", someOtherObject);
最后,PFQuery 相当透明地处理数组。要查找 arrayOfPointersCol 中包含 PFObject 的任何 myObject,请使用 equalTo,就好像它只是一个值一样。
myQuery.equalTo("arrayOfPointersCol", someOtherObject);
// if you have only an id, say someId, then
var SomeOtherClass = Parse.Object.extend("SomeOtherClass");
var someOtherObject = new SomeOtherClass();
someOtherObject.id = someId;
myQuery.equalTo("arrayOfPointersCol", someOtherObject);
与非数组指针类似,您可以急切地获取该数组中的所有元素:
myQuery.include("arrayOfPointersCol"); // but be careful, keep array lengths short
下划线
最后,与数组或指针的想法无关,您当然可以映射一个对象 ID 数组,将它们转换为一个指针对象数组。您发布的代码看起来不错,但它依赖于 the underscore library——这是一个非常有用的库,提供了 _.map 等许多功能。
如果您的 "Creator" 列是 Pointer<_User> 类型并且您的 allFriends
数组是用户 ID 数组,那么您需要做的是:
从 allFriends
:
var pointers = _.map(allFriends, function(friendId) {
var pointer = new Parse.User();
pointer.id = friendId;
return pointer;
});
一旦你有了一个 Pointer<_User> 数组,你就可以比较你的列:
query.containedIn('Creator', pointers);
你非常接近,只是创建正确类型的指针的问题。
可能有点晚了,但您也可以使用方法 createWithoutData
从 ID 构建对象
如果你想要多指针列,只需创建数组列并用_User 对象填充它。结果看起来像这样,它实际上是指针数组:
[{"__type":"Pointer","className":"_User","objectId":"kIg9Kzzls9"},
{"__type":"Pointer","className":"_User","objectId":"TGCBZm52zW"},
{"__type":"Pointer","className":"_User","objectId":"YfGT9GvJs6"}]
使用 include 获取查询中的完整对象也可以,它是一个指针数组。