Strategia AND
Problem nie polega na sortowaniu topologicznym (DFS, a nie BFS może posłużyć do tego), ale BFS też się nie do końca sprawdzi. Tzn. to nad czym myślę będzie jak sądzę uogólnionym BFSem. Postaram się wieczorem opisać o co chodzi.
Strategia OR
Wygląda na to, że jednak da się to zrobić w mongo - raczej dosyć hakierskie, ale pozostawiam Wam do oceny (zapytanie jakie jest w niniejszym przykładzie da się w miarę łatwo skonstruować automatycznie).
db.books.aggregate([
{$facet: {
1: [
{$lookup: {
from: "artists",
localField: "artist",
foreignField: "_id",
as: "artist_item" }
},
{$unwind: "$artist_item"},
{$match: {"artist_item._id": {$lte: 2}}}
],
2: [
{$lookup: {
from: "artists",
localField: "artist",
foreignField: "_id",
as: "artist_item" }
},
{$unwind: "$artist_item"},
{$match: {"artist_item._id": {$gte: 2}}}
]
}},
{$project: {results: {$concatArrays: ["$$CURRENT.1", "$$CURRENT.2"]}}},
{$project: {
uniqueResults: {
$reduce: {
input: "$results",
initialValue: {ids: [], items: []},
in: {
items: {
$cond: [
{$in: ["$$this.sealious_id", "$$value.ids"]},
"$$value.items",
{$concatArrays: ["$$value.items", ["$$this"]]}
]
},
ids: {$setUnion : ["$$value.ids", ["$$this.sealious_id"]]}
}
}
}
}},
{ $unwind : "$uniqueResults.items" },
{ $replaceRoot : {newRoot: "$uniqueResults.items" }}
]);
Nie wiem na ile jest to wydajne, ale działa