I'm using MongoDB 3.4.15, I want to find all documents from the Rating
collection where the resultid is not in the Result
collection.
let's say that there is only one document in each collection
Rating collection
{
"_id" : ObjectId("6255818aaaaa7f47c79eba01"),
"_class" : "rating",
"ratingid" : "b6885038-17ef-437c-b9c8-be7336a09744",
"value" : 5,
"components" : [
{
"resultid" : "2285e41f-ebe4-4372-8cf8-64dfe91a9733"
},
{
"resultid" : "69053352-d933-46a0-a20c-3863e01b87d6"
}
]
}
Result collection
{
"_id" : ObjectId("62558188aaaa7f47c79eb9ff"),
"_class" : "normal_results",
"resultid" : "2285e41f-ebe4-4372-8cf8-64dfe91a9733",
"totalTime" : Double("10"),
"lastModified" : NumberLong("1649770887268"),
"creationDate" : NumberLong("1649770887268"),
}
In this case, the Rating
collection's document should be returned, because "resultid" : "69053352-d933-46a0-a20c-3863e01b87d6"
is not into Result
collection.
Please help me to write the query.
CodePudding user response:
You can simply perform the $lookup
and compare whether the $size
of the lookup result is equal to $size
of components
array.
In Mongo v3.4, you can do below:
db.Rating.aggregate([
{
"$lookup": {
"from": "Result",
"localField": "components.resultid",
"foreignField": "resultid",
"as": "resultLookup"
}
},
{
"$addFields": {
"dedupeComponents": {
"$reduce": {
"input": "$components",
"initialValue": [],
"in": {
"$cond": {
"if": {
"$in": [
"$$this.resultid",
"$$value"
]
},
"then": "$$value",
"else": {
"$concatArrays": [
"$$value",
[
"$$this.resultid"
]
]
}
}
}
}
},
"resultLookup": {
"$reduce": {
"input": "$resultLookup",
"initialValue": [],
"in": {
"$cond": {
"if": {
"$in": [
"$$this.resultid",
"$$value"
]
},
"then": "$$value",
"else": {
"$concatArrays": [
"$$value",
[
"$$this.resultid"
]
]
}
}
}
}
}
}
},
{
$addFields: {
matched: {
$eq: [
{
$size: "$dedupeComponents"
},
{
$size: "$resultLookup"
}
]
}
}
},
{
"$match": {
matched: false
}
},
{
"$project": {
// cosmetics
matched: false,
dedupeComponents: false,
resultLookup: false
}
}
])
Here is the Mongo playground for your reference.