0

私は MongoDB の初心者で、いくつかのドキュメント コレクションのリンクされたドキュメントをクエリするときに問題があります。

これが私のデータベーススキームです:

var tagScheme = Schema({
    name: { type: String, required: true }
});
tagScheme.index({ name: 1 }, { unique: true });


var linkScheme = Schema({
    name: { type: String },
    tags: [{ type: Schema.Types.ObjectId, ref: 'Tag' }]
});
linkScheme.index({ name: 1 }, { unique: true });

指定されたタグの適切なリンクの数を取得する必要があります。次のクエリを実行しようとしています。

dbschemes.Link.find({ 'tags.name': specifiedTagName }, function (err, links) {
    return res.send(500, err);
    alert(links.length);
});

このクエリは正しく機能しません。常に空のリンク リストが返されます。誰かが私に何が問題なのか説明してもらえますか?

4

1 に答える 1

0

JohnnyHK がコメントしたように、実行したいクエリのタイプはリレーショナル タイプのクエリであり、mongodb などのドキュメント データベースはそれらをサポートしていません。そのタグ データをリンク スキーマに直接配置するようにスキーマを修正し (リレーショナルな観点からネストまたは「非正規化」します。この場合は問題ありません)、クエリを実行できます。

var LinkSchema = new Schema({
  name: String,
  tags: [String]
});

そのスキーマを使用すると、クエリは期待どおりに機能します。

以下のコメントに対処します。これは文書データベースです。それはリレーショナルではありません。トレードオフがあります。データは非正規化されており、ある程度のスケーラビリティとパフォーマンスが得られます。クエリの柔軟性とデータの一貫性をトレードオフしてそれらを取得します。タグの名前を変更したい場合は、比較的まれなケースですが、単一の更新コマンドを使用する関係とは対照的に、なんと 2 つのデータベース コマンド (新しい名前の $push と古い名前の $pull) を実行する必要があります。それをするでしょう。

于 2013-09-02T15:42:10.977 に答える