Parse.com 查询包含在指针数组中

Parse.com Query containedIn Array of Pointers

本文关键字:指针 数组 包含 com 查询 Parse      更新时间:2023-09-26

原始问题

我正在尝试查询 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

我发现我需要将 ID 的allFriends数组转换为指针映射。 但是,_.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

如果你的"Creator"列是指针类型<_User>而你的allFriends数组是用户的ID数组,那么这就是你需要做的:

allFriends创建指针<_User>对象数组:

var pointers = _.map(allFriends, function(friendId) {
  var pointer = new Parse.User();
  pointer.id = friendId;
  return pointer;
});

获得指针数组后<_User>您可以比较您的列:

query.containedIn('Creator', pointers);

你非常接近,这只是创建正确类型的指针的问题。

Parse 允许您定义指针列或数组列。 数组是标量类型(数字、字符串等)的有序集合,也可以是指针数组。

指针

获取和设置指针时,操作数是 PFObject。 换句话说,对于二传手:

myObject.set("somePointerCol", someOtherObject);

其中 someOtherObject 是一个 PFObject,可能是一个空的,只定义了一个 ID(正如您在编辑中正确指出的那样)。 对于吸气者:

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 为数组提供了几种方法,您可以使用 addaddUnique 添加到数组中,并使用 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 数组,将它们转换为指针对象数组。 您发布的代码看起来不错,但它取决于下划线库 - 这是一个非常有用的库,提供 _.map 函数等。

可能

有点晚了,但您也可以使用方法createWithoutData从 ID 构建对象

文档

如果你想有多指针列,只需创建数组列并用_User对象填充它。结果将如下所示,它实际上是指针数组:

[{"__type":"Pointer","className":"_User","objectId":"kIg9Kzzls9"},
{"__type":"Pointer","className":"_User","objectId":"TGCBZm52zW"},
{"__type":"Pointer","className":"_User","objectId":"YfGT9GvJs6"}]

使用 include 在查询中获取完整对象也可以,它是一个指针数组。