2016-07-02 3 views
1

私は単に、req.user._idが見つかったすべてのドキュメント(サイト)をサブドキュメント(マネージャ)の配列内に返そうとしています。値が配列内にある文書を返すにはどうすればよいですか? Mongoose.js

ユーザーは複数のサイトを管理できるため、これらの関連するサイトをすべて一覧表示する方法が必要です。

Site.find({}).elemMatch('managers', {_id: req.user._id}).exec((err, sites) => { 
    if (err) { 
    console.log(err) 
    return res.status(500).send('Something went wrong'); 
    } 
    return res.json(sites) 
}); 

Mongoose elemMatch私は運が無かった。 どこでもドキュメントでこれを見つけることはできませんが、実行する簡単なクエリのようです。ここで

(編集済み)は、サンプル・スキーマおよびドキュメントです:あなたは、クエリのsubdocment以内に到達しようとしているので、

import mongoose from 'mongoose'; 

var Schema = mongoose.Schema; 
const SiteSchema = new Schema({ 
    city: { 
      type: String 
    }, 
    siteRef: { 
      type: String 
    }, 
    managers: [{ 
      type: Schema.ObjectId, 
      ref: 'User' 
    }], 
}); 


export default mongoose.model('Site', SiteSchema); 

答えて

1

ElemMatchは、このための最良の照会方法ではないでしょう。

私はあなたがmongoose populateを探していると思います。 「管理職」で、あなたでしょう、あなたのケースで

Kitten.find().populate({ 
    path: 'owner' 
    , select: 'name' 
    , match: { color: 'black' } 
    , options: { sort: { name: -1 }} 
}).exec(function (err, kittens) { 
    console.log(kittens[0].owner.name) // Zoopa 
}) 

// alternatively 
Kitten.find().populate('owner', 'name', null, {sort: { name: -1 }}).exec(function (err, kittens) { 
    console.log(kittens[0].owner.name) // Zoopa 
}) 

「パス」:それらが提供する例を見て何が起こっているかをよりよく理解するために

Site.find().populate('managers', null, req.user._id).exec((err, managers) => { 
    if (err) { 
     return (err) 
    } 
    return res.json(sites) 
}); 

すると、このような何かを試してみてください「req.user._id」がモデルのいずれかのフィールドに一致するすべてのサイトを返しています。

関連する問題