2

私は特定の単純なケースを扱っています。私はこれに対する解決策を見つけることができないように思われるので、私はいくつかの助けが必要です。

javascriptクラス内にMongoDBの単純なスキーマとモデルを作成しました。

this.UserSchema = new this.Schema({
    UserId: { type: String }, 
    IsToggle: { type: Boolean}
});

this.CalendarViewUserSchema = new this.Schema({ 
    _id:  { type: this.Schema.ObjectId },
    OwnerId: { type: String },
    UserList: [ this.UserSchema ] 
});

this.CalendarViewUser = this.mongoose.model('CalendarViewUsers',this.CalendarViewUserSchema);

これはコンストラクターにあり、すでに多くのデータベースインタラクションが機能していますが、これを機能させることができません。

新しいドキュメントを追加するために、このメソッドを呼び出します。

AddCalendarViewUser : function(Id, UserToAddId){        
        NewUser = { UserId : UserToAddId, IsToggle : false };

        this.CalendarViewUser.update(
        { OwnerId : Id },
        { 
                       $set:  { OwnerId  : Id      },
           $push: { UserList : NewUser } 
                    },
        {upsert:true},
        function(err){
            if(err) {console.log(err);}
            else {console.log('Success');}
        }
    );
}, // this comma just introduces the next method.

これは正常に機能します。Mongo Explorerを使用すると、ドキュメントが正しく作成されていることがわかります。.find()を使用してコレクションからすべてを取得すると、ドキュメントが表示されます。

次に、挿入されたドキュメントを次のように検索します。

FindCalendarViewUser : function(Id){
    this.CalendarViewUser.findOne(
                { OwnerID : Id }, 
                function(err,result){

            if(err) {console.log(err);}
            else{console.log(result);}  
        }
        );
}

ここでは、result=nullを返します。

「Id」パラメータは、スキーマの「OwnerId」と同様に、両方のメソッドの文字列です。

私は何が間違っているのですか?

「OwnerId」と「Id」はどちらも同じです。また、両方をObjectIdに変換しようとしましたが、成功しませんでした。

コードのフォーマットについて申し訳ありません。

編集:

基本的に、_idフィールドを使用してドキュメントを見つけることができます。

{ _id : '4fb0d1702edfda0104fc2b9f'}

しかし、OwnerIdフィールドでは見つかりません。

{ OwnerId : '4f55e1a6c2c7287814000001'}

これらの値はデータベースから直接取得されたため、実際に保存されている値に対応しています。

編集2:

手で値を挿入すると、次のことがわかりました。

$set:  { OwnerId  : '4f55e1a6c2c7287814000001' }

次に、まったく同じ文字列で検索すると、ドキュメントが返されます。

this.CalendarViewUser.findOne(
                    { OwnerID : '4f55e1a6c2c7287814000001'}
...

したがって、ドキュメントのOwnerIDフィールドに何らかのゴミが挿入されているか、フィールドのTypeと何らかの非互換性があったと思います。結果を掲載します。

4

2 に答える 2

2

結局のところ、FindCalendarViewUser関数のコールバック関数には、それ自体の周りに括弧が必要でした...これらの括弧を追加するだけで機能するようになりました...

FindCalendarViewUser : function(Id){
    this.CalendarViewUser.findOne(
        { OwnerID : Id }, 
        (function(err,result){

            if(err) {console.log(err);}
            else{console.log(result);}  
        })
    );
}

これが実際の例です。イエス・キリストなぜ。私は他の機会にそれなしで使用したことを誓ったかもしれません。

編集:そして今、それは括弧なしで機能しています。ごめんなさい。それは私がコードの周りに持っているいくつかの小さな問題であるに違いありません。見つかりません。

于 2012-05-14T11:59:12.433 に答える
1

打ち間違え?

if(err) {console.log(err);}
  else{console.log(err);} 
}
于 2012-05-11T17:57:02.900 に答える