4

願わくばこのプロジェクトのために、またあなたの助けが必要になります。これはよくある質問ですが、スタック オーバーフローの別の投稿Google グループのヒントを試してみましたが、解決策がうまくいきませんでした。

私のコードは少し似ています:

mongoose = require('mongoose');
Schema = mongoose.Schema;
mongoose.connect(MONGO_SERVER);
ObjectId = Schema.ObjectId;

var RacesSchema = new Schema({
    venue_id        : { type: mongoose.Schema.ObjectId, ref: 'Venues' },
    racetype            : String
});
var races = mongoose.model('Races', RacesSchema );

function test() {
    var MyObjectId = require('mongoose').Types.ObjectId;
    queryVenue = new MyObjectId("50e3dcdbf30375180c078f64");

    races.find({venue_id: queryVenue, racetype:'Test'})
    .exec(function(err,data) {
}

test();

しかし、私は結果が得られないことを知っています。

よろしくお願いします!

アップデート

上記のコード サンプルを最小化しました。このテストは、文字列値を単独でクエリすると機能します。ObjectId をクエリするだけで失敗し、存在することがわかります。

JSON の更新

これが私が探しているものです:

{
    "_id" : ObjectId("50e3dcddf30375180c078f85"),
    "venue_id" : "50e3dcdbf30375180c078f64",
    "racetype" : "A"
}

そして突然、私の答えが明らかになったと思います。これは単に、venue_id が実際には文字列だからですか? もしそうなら、マングーススキーマをそのままにして、文字列であるという検索を行う時点でクエリをキャストできますか? または、これらの値が (私が開発した別の .net アプリケーションから) 格納される方法を変更して、ObjectId として挿入する必要がありますか?

現在、別のクエリ、現在の mongoose スキーマ、およびデータベースの [実際のセットアップ] の方法については、populate() を使用して、参照されたテーブル (venue_id) の結果をこのモデルの現在のセットアップ方法で埋めるのに非常にうまく機能します。 、違いは上記のクエリだけで、venue_id を指定していません...

ありがとう。

4

1 に答える 1

3

venue_idそうです、スキーマのデータ型(ObjectId)がドキュメントのデータ型(String)と一致しないため、問題が発生しています。したがって、findはObjectId値を探していますが、ドキュメント内の文字列であるため、一致するものは見つかりません。

venue_idこれに対する正しい修正は、ドキュメント内の値を文字列ではなくObjectIdsに更新する小さなプログラムを作成することです。そうすれば、クエリが機能します。これにより、これらのフィールドのサイズも24バイトから12バイトに縮小されます。

于 2013-02-23T13:52:36.107 に答える