Question:
I have a cloud function on Parse. When it's called it retrieves a PFObject then adds a relation between that object and the user. This part works fine (Seen towards the end of the function). I'm having trouble getting the query that selects the PFObject to ignore those that the user is already related to
I'm sure i'm just not understanding how the relation query syntax works.
Parse.Cloud.define("NextMedia", function (request, response) {
var LikeRequest = Parse.Object.extend("LikeRequest");
var query = new Parse.Query(LikeRequest);
query.equalTo("completed", false);
console.log("user: " + Parse.User.current().id);
query.notEqualTo("user", Parse.User.current());
// Also only fetch if never been sent before
// HERE SHOULD USE THE BELOW RELATIONSHIP
var innerQuery = new Parse.Query(Parse.User);
innerQuery.exists(Parse.User);
query.matchesQuery("sentTo", innerQuery);
query.ascending("createdAt");
query.first({
success: function (object) {
// Successfully retrieved the object.
console.log("Got 1 object: " + object.get('mediaId'));
// Record that the user has been sent it
var user = Parse.User.current();
var relation = object.relation("sentTo"); // RELATION ADDED HERE
relation.add(user);
object.save();
response.success(object);
},
error: function (error) {
console.log("Error: " + error.code + " " + error.message);
response.error("Error getting next mediaId");
}
});
});
Answer:
I think Kerem has it partially correct but notContained in is not dynamic enough for your case. You need to construct the query from the relation and then use doesNotMatchKeyInQuery to exclude those objects from your outer query.
This stretch:
// Also only fetch if never been sent before
// HERE SHOULD USE THE BELOW RELATIONSHIP
var innerQuery = new Parse.Query(Parse.User);
innerQuery.exists(Parse.User);
query.matchesQuery("sentTo", innerQuery);
Could be changed to:
// Also only fetch if never been sent before
query.notContainedIn("sentTo",[Parse.User.current()])
what about Query Constraints?
If you want to retrieve objects that do not match any of several values you can use notContainedIn
// Finds objects from anyone who is neither Jonathan, Dario, nor Shawn
query.notContainedIn("playerName",
["Jonathan Walsh", "Dario Wunsch", "Shawn Simon"]);
No Comment to " How to Parse Cloud Code relational query syntax "