2016-11-24 6 views
0

私はContentスキーマを持っています。それはcoursecontentフィールドを持っています。 contentフィールドは2つのサブフィールドcontent1content2を持ち、両方ともObjectIdsの配列です。私は、与えられたObjectId(指定されたObjectIdより大きい)より遅く作成されたcontent1からObjectIdsをすべて検索したいと思います。mongooseで与えられた値より大きい配列のすべての要素を返します

問題は私のコードでは、私はObjectIdの1つだけを取得していますが、私はのすべてを取得したいです。

私のスキーマは次のとおりです。

var CurrentContentSchema = new mongoose.Schema({ 
    "course" : Number, 
    "content" : { 
     "content1" : [ 
      { 
       type : mongoose.Schema.Types.ObjectId, 
       ref : 'First' 
      } 
     ], 
     "content2" : [ 
      { 
       type : mongoose.Schema.Types.ObjectId, 
       ref : 'Second' 
      } 
     ] 
    } 
}); 

私のコードは次のとおりです。

CurrentContent.find({ 
     'course' : givenCourse, 
     'content.content1' : { $gt : givenId} 
    },{ 
     'course' :1, 
     'content.content1.$' : 1 
    }). 
     exec(function(err,contents) {... 
}); 

すべてのヘルプは高く評価されています。

+0

を試すことができ、彼らは常に複数のマシンに増加arn'tので、行うには正しいものではありません。このフィールドが必要な場合は、タイムスタンプの追加を検討してください。 – hyades

+0

私はその機能を追加することができますが、後で作成される配列のすべての要素を、特定の '_id'で表される要素をどのように取得するのですか? 。 '$'は複数の配列要素ではなく配列要素を1つだけ与えます。 –

+0

それ以外に、 'ObjectId'はうまくいくと思います。もし私が他の何か(' timestamp'を追加する)を考えていないと思っています。しかし、私の質問は、単一のものではなく、 '$ gt'や' $ lt'の条件に合致する要素をすべて得る方法です。 –

答えて

0

findは、content1の配列要素のいずれかが一致する場合、ドキュメントに一致します。それがマッチした後はさらに見えません。したがって、$には1つの値しかありません。

後で作成された表現のための `ObjectID`を使用して、この集約パイプライン(それを実行しなかった)

[ 
    { 
     $match: { 
     'course' : givenCourse, 
     'content.content1' : { $gt : givenId} 
     } 
    }, 
    {$unwind: 'content.content1'}, 
    { 
     $match: { 
     'course' : givenCourse, 
     'content.content1' : { $gt : givenId} 
     } 
    }, 
    {$project: { 
     course: 1, 
     content1: '$content.content1' 
    }} 
] 
+0

これの後に私は人口を使うことができますか? –

+0

集計を使用することを恐れていましたが、この後に集計を使用することはできませんでした。何か道があれば教えてください。 –

+0

DBRefを使用していますか?もしそうなら、どのような形式でもプロジェクトに参加することができ、コールバック関数では、mongooseを使うのではなく 'findOne'を明示的に使うことができます。 – hyades

関連する問題