Irgendwie habe ich es geschafft, dass die Skriptfunktion richtig funktioniert.
Hier sind meine Änderungen (mit ein wenig Hilfe von einem Claude Code
)
>mongo.rb
def posts(offset = 0, page_size = 1000)
post_keys = mongo.find(_key: "posts:pid").skip(offset).limit(page_size).pluck(:value)
post_keys
.map { |pid| post(pid) }
.compact # <-- verwirft alle nil-Ergebnisse (verwaiste pids)
post_keys.map { |post_key| post(post_key) }
end
def post(id)
post = mongo.find(_key: "post:#{id}").first
return nil if post.nil? # <-- Null-Prüfung
post["timestamp"] = timestamp_to_date(post["timestamp"])
if post["upvoted_by"] = mongo.find(_key: "pid:#{id}:upvote").first
post["upvoted_by"] = mongo.find(_key: "pid:#{id}:upvote").first[:members]
else
post["upvoted_by"] = []
end
post["pid"] = post["pid"].to_s
post["deleted"] = post["deleted"].to_s
post
end
>nodebb.rb
create_posts(posts, total: post_count, offset: offset) do |post|
# überspringe, wenn post null ist
# überspringe, wenn es merged_post ist
next if post.nil?
next if @merged_posts_map[post["pid"]]
# überspringe, wenn es gelöscht ist
next if post["deleted"] == "1"
raw = post["content"]
post_id = "p#{post["pid"]}"
next if raw.blank?
topic = topic_lookup_from_imported_post_id("t#{post["tid"]}")
unless topic
puts "Topic with id #{post["tid"]} not found, skipping"
next
end
Es scheint jetzt auf die richtige Weise zu funktionieren.
Obwohl ich nicht weiß, wie korrekt dies aus der Sicht der internen Architektur von Discourse ist, scheint es auf den ersten Blick zu funktionieren.
Jeder Vorschlag zur Verbesserung und Optimierung ist herzlich willkommen.