6

Angular + Express + mongodb を使用して何かを構築する最初の試みなので、おそらくこれは完全に間違った方法で行っています。Express は json を提供するために使用されています。その後、Angular がすべてのビューなどを処理します。

Mongoose を使用して Mongo とやり取りしています。

次のデータベース スキーマがあります。

var categorySchema = new mongoose.Schema({
  title: String, // this is the Category title
  retailers : [ 
    {
      title: String,  // this is the retailer title
      data: {       // this is the retailers Data
        strapLine: String,
        img: String ,  // this is the retailer's image
        intro: String,
        website: String,
        address: String,
        tel: String,
        email: String
      } 
    }
  ]
});

var Category = mongoose.model('Category', categorySchema);

Express では、データを取得するためのルートがいくつかあります。

 app.get('/data/categories', function(req, res) {
   // Find all Categories.
   Category.find(function(err, data) {
     if (err) return console.error(err);
     res.json(data)
   });
 });


 // return a list of retailers belonging to the category
 app.get('/data/retailer_list/:category', function(req, res) {
   //pass in the category param (the unique ID), and use that to do our retailer lookup
   Category.findOne({ _id: req.params.category }, function(err, data) {
     if (err) return console.error(err);
     res.json(data)
   }); 
 });

上記はうまくいきます - 私は単一の小売業者を手に入れようとして大きな問題を抱えています. 私はカテゴリと小売業者の ID を渡しています...カテゴリで検索を実行してから、その中のコンテンツで findOne を実行するなど、あらゆる種類のことを試しました...しかし、うまくいきません。私はおそらくこれについてすべて間違っていると思います...

ここでこのスレッドを見つけました: Mongoose の findOne サブドキュメントとソリューションを実装しましたが、必要な小売業者だけでなく、すべての小売業者を返します。

// Returns a single retailer
app.get('/data/retailer_detail/:category/:id', function(req, res) {
  //pass in the category param (the unique ID), and use that to do our retailer lookup
 Category.findOne({_id: req.params.category , 'retailers.$': 1}, function(err, data) {
    console.log(data);
    if (err) return console.error(err);
    res.json(data)
  }); 
});    

ありがとう、ロブ

4

2 に答える 2

9

完全なフィルター/クエリが表示されたので、この場合、クライアント側のフィルタリングを行うのではなく、射影の一部として配列位置演算子を使用できるはずです。

app.get('/data/retailer_detail/:category/:id', function(req, res) {
  //pass in the category param (the unique ID), and use that to do our retailer lookup
 Category.findOne({
    /* query */
    _id: req.params.category , 
    'retailers._id' : req.params.id
  },
  {  /* projection */
     "retailers.$" : 1 
  }, 
  function(err, data) {
  var retailer = _.where(data.retailers , { id : req.params.id });
    if (err) return console.error(err);
    res.json(retailer)
  }); 
}); 

{ "retailers.$" : 1 }正しく機能するには、クエリに配列内の要素のフィールドが含まれている必要があります。$演算子は最初の一致のみを返します。

于 2013-09-19T16:33:07.600 に答える
1

隣の人たちは Mongo + Express を使っていて、私にいくつかの指針を与えてくれました。彼らは mongo がどのように機能するかを説明し、underscore.js を使ってフィルターを補助するようアドバイスしてくれました。

彼らは、カテゴリ全体を取り出してからフィルターを実行する必要があると言いました。'retailers._id' : req.params.id} は厳密には必要ありませんが、カテゴリ内のアイテムにその情報が含まれている場合にのみカテゴリが返されることが保証されているため、そのままにしておくように言われました。理由や方法はまだよくわかりません...だから、これを解決済みとしてマークすることはできません..解決しましたが、まだ理由がわかりません-もっと読むつもりです:)

app.get('/data/retailer_detail/:category/:id', function(req, res) {
  //pass in the category param (the unique ID), and use that to do our retailer lookup
 Category.findOne({_id: req.params.category , 'retailers._id' : req.params.id}, function(err, data) {
  var retailer = _.where(data.retailers , { id : req.params.id });
    if (err) return console.error(err);
    res.json(retailer)
  }); 
}); 
于 2013-09-19T11:15:27.143 に答える