0

に一つだけの要素でそれを取得:のMongoDB - だから私はMongoDBの中で、このデータを持って呼ばれた文書を検索し、その内側の配列

プロセスの文書:

process: { 
    procnumber: '1', 
    person: { 
     $ref: 'person', 
     $id: ObjectId("5126bc054aed4daf9e2ab772") 
    } 
} 
process: { 
    procnumber: '2', 
    person: { 
     $ref: 'person', 
     $id: ObjectId("5126bc054aed4daf9e2ab996") 
    } 
} 

ユーザー文書:

person: { 
    _id: ObjectId("5126bc054aed4daf9e2ab772"), 
    name:'person_1', 
    obsarray:[{date:ISODate("2017-02-13"),obs:'1.this is one'},{date:ISODate("2017-02-20"),obs:'1.this is two'},{date:ISODate("2017-02-01"),obs:'1.this is three'}] 
} 
person: { 
    _id: ObjectId("5126bc054aed4daf9e2ab996"), 
    name:'person_2', 
    obsarray:[{date:ISODate("2017-02-17"),obs:'2.this is one'},{date:ISODate("2017-02-27"),obs:'2.this is two'},{date:ISODate("2017-02-28"),obs:'2.this is three'}] 
} 

そして、クエリがプロセスと人物の両方のフィールドを返すようにクエリを作成したいと同時に、obsarrayは最新の日付のドキュメントのみを返すようにします。所望の出力の 例:

{ 
procnum:'1', 
person: { 
    name:'person_1', 
    obsarray: { 
     date:ISODate("2017-02-20"), 
     obs:'1.this is two' 
    } 
} 

しかし私は、私が参照して対処することができなかった、集約を使用して試してみた:

db.person.aggregate([ 
    {$match:{name:{$exists:true}}}, 
    {$unwind:'$obsarray' }, 
    {$sort:{'obsarray.date':-1}}, 
    {$group:{ 
     _id:'$_id', 
     obsarray:{$first: '$obsarray.date'}, 
     name:{$first:'$name'}} 
    } 
]) 

がから「人のREFを移入する方法はあります'Process'を実行し、両方のドキュメントのフィールドを出力するように集計を適用しますか?

答えて

0

DBRefを手動参照に変更しました。何かのように

var ProcessSchema = new mongoose.Schema({ 
    procnumber: String, 
    person: { 
    type: Schema.Types.ObjectId,   
    ref: 'Person' 
    } 
}); 

文書を更新すると、次のようになります。

process: { 
    procnumber: '1', 
    person: { 
     _id: ObjectId("5126bc054aed4daf9e2ab772") 
    } 
} 

$lookupを使用すると、集計クエリで他のコレクションの情報を取得できるようになりました。

db.person.aggregate([ 
    {$match:{name:{$exists:true}}}, 
    {$lookup: { 
     from: "process", 
     localField: "_id", 
     foreignField: "person._id", 
     as: "person_process"} 
    }, 
    {$unwind:'$person_process'}, 
    {$unwind:'$obsarray' }, 
    {$sort:{'obsarray.date':-1}}, 
    {$group:{ 
     _id:'$_id', 
     obsarray:{$first: '$obsarray.date'}, 
     name:{$first:'$name'}}, 
     procnum:{$first:'$person_process.procnum'}} 
    } 
]) 
関連する問題