2017-02-08 16 views
0

私はFileと呼ばれるマングース(4.8.1)スキーマを持っています。各ファイルはワークスペースに属します。各ワークスペースはプライベートでもプライベートでもありません。ネストされたmongooseオブジェクトのクエリ属性

私は、ワークスペースがプライベートであるかどうかをチェックして、ワークスペース内のファイルを見ることを許可します。私のマングーススキーマは:

var File = new mongoose.Schema({ 
    filename: { 
    type: String, 
    required: true 
    }, 
    workspaceId: { 
    type: String, 
    required: true, 
    ref: 'Workspace' 
    } 
}); 


var Workspace = new mongoose.Schema({ 
    name: { 
    type: String, 
    required: true 
    }, 
    isPrivate: { 
    type: Boolean, 
    default: true 
    }, 

})です。

だから最初のオフ、私はワークスペース内のすべてのファイルを取得します:正しい(theresのワークスペース内に一つだけのファイル)である

[ { __v: 1, 
    _id: 589afc46012a0d0e7c3f4e55, 
    filename: 'file-1486552134649.txt', 
    workspaceId: '589af17765b3bd72213c6fcb' 
} ] 

File.find({ 
    workspaceId: workspaceId 
}) 
.exec().then(function(filesDb){ 

    console.log('filesDb are ', filesDb); 

} 

私はで終わります。

ワークスペースは、プライベートではありませんので、私は最初workspaceIdを移入:

File.find({ 
    workspaceId: workspaceId 
    }) 
    .populate('workspaceId') 
    .exec().then(function(filesDb) { 

    console.log('filesDb are ', filesDb); 

    }) 

と私は正しくで終わる:

[ { __v: 1, 
    _id: 589afc46012a0d0e7c3f4e55, 
    filename: 'file-1486552134649.txt', 
    workspaceId: 
    { __v: 1, 
     _id: 589af17765b3bd72213c6fcb, 
     isPrivate: false, 
    }  
    } 
] 

だから今、私は、ファイルから来ていることを確認します非公開のワークスペース:

File.find({ 
    workspaceId: workspaceId 
    }) 
    .populate('workspaceId') 
    .find({ 
    'workspaceId.isPrivate': false 
    }) 
    .exec().then(function(filesDb) { 

    console.log('filesDb are ', filesDb); 

    }) 

しかし、filesDbは終了します。空の配列。

.find({ 
    workspaceId: { 
     isPrivate: false 
    } 
    }) 

しかし、これは関係なく、ワークスペースがプライベートであるかどうかのファイルを返します。

は、私はそのような findに変更するなど、他のものを試してみました。

どのようにして、ネストされたオブジェクトの属性をクエリできますか?

答えて

0

マングースは、populate dフィールドでのクエリをサポートしていません。一致するすべてのクエリをFileに照会し、Workspaceを入力し、Workspaceを参照するFileを除外します。私は、例えば、そのための静的メソッドを定義したい:

File.statics.findPublicInWorkspace = function(workspaceId) { 
    return this.find({ 
    workspaceId: workspaceId 
    }) 
    .populate('workspaceId') 
    .then(function(files) { 
    return files.filter(function(file) { 
     return !file.workspaceId.private; 
    }) 
    }) 
}; 

、その後

File.findPublicInWorkspace(workspaceId) 
.then(function(filesDb) { 
    console.log('filesDb are ', filesDb); 
}) 

をそれ以外の場合は、あなたが唯一のワークスペースに属しているファイルを照会するとして、あなたはこのワークスペースを照会することができます最初。公開されているかどうかに応じて、すべてのファイルまたは空のリストをそれぞれ返します。

関連する問題