Reimplementacja agregacji

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 :smiley: