あなたが何をしようとしているのかよくわかりませんが、次のことをお勧めします。
文字列の「@」タグと MongoDB ドキュメント内のフィールドとの間のマッピングとして機能するドキュメントを作成します。
タグ配列に、実際のデータが保存されているドキュメントの _id 値と、これらのドキュメントでデータを取得するフィールドの両方を識別する標準化されたドキュメントが含まれるように、Post ドキュメントを変更します。
(オプション) Post ドキュメントを変更して、マッピング ドキュメント _id を明示的に含めます。グローバル マッピング ドキュメントがある場合、これは不要ですが、
あなたの例では、マッピング ドキュメントは次のようになります。
Mapping: { _id: "abc..", maps: [{tag:"user", field:"user.person.nickname"}, {tag:"thing", field:"object.name"}] }
投稿文書は次のようになります。
Post: { _id: "48ajsdlfhsdjfkjsljsd",
name: "Post One",
text: "@user is the best for liking @thing, and @thing",
tags: [{tag:"user", docId:"pqr..."}, {tag:"thing", docId:"xzy..."}, {tag:"thing", docId:"mno..."}],
mapping: "abc..."
}
テキスト文字列を返すには、次の操作を行う必要があります。
- Post ドキュメントを読み込む
- マッピング ドキュメントを抽出してロードします (このマッピングがグローバルである場合、この手順は必要ありません)。
基になるデータに対応するすべてのドキュメントを 1 回の読み込みで読み込みます。
db.posts.find( { _id: { $in : [ "pqr...", "xyz...", "mno..." ] } })
見つかった各ドキュメントの必須ドキュメント フィールドから値を取得します
- タグをフィールド値に置き換えます
この方法では、文字列内のタグの意味を変更する (マッピング ドキュメントを変更する - たとえば、@user をニックネームから実名に変更する) ことと、タグの値を変更する (タグに格納されている docIds を変更する) ことができます。 Post ドキュメント内のリスト) ですが、文字列の生成には少なくとも 4 つの手順が必要です。
この方法では、マッピング ドキュメントにタグが含まれていない場合や、タグ リストがテキスト文字列内のタグの数と同じサイズでない場合は処理されません。