2017-01-02 4 views
0

MongoDBがコレクションのキーの内容全体を1つの検索キーワードで検索する方法はありますか?私はそれが「チョコレートムースケーキ」を返すと「ダークなければならないという意味、私の検索は、「チョコレート」を含む一致を見てみたいMongoDBコレクション内のすべてのキーを1つのキーワードだけで検索する方法

{  
    name: "Chocolate Mousse Cake", 
    type: "Cake" 
}, 
{ 
    name: "Mother's Cookies", 
    type: "Cookies" 
}, 
{ 
    name: "Dark Bar", 
    type: "Chocolate" 
} 

は、私は、次のコレクションを(のはfoodCollectionそれを呼びましょう)があるとしバー"。

私はこのFFを使ってやろうとしている:コード:

クライアント側のコントローラ

// Search Products 
$scope.searchProduct = function() { 

    $http.get('/api/products/search/' + $scope.searchKeyword).success(function(data){ 
     console.log(data); 
    }) 
    .error(function(err) { 
     console.log("Search error: " + err); 
    }); 
} 

Express.js

app.get('/api/products/search/:param', productController.search); // Search for product

サーバー

をサイドコントローラ
は(私はMongoDBのドキュメントから this referenceを使用):私はこれを実行

// Search 
module.exports.search = function(req, res) { 

    console.log("node search: " + req.body); 

    Product.find({ $or: [{productName: req.body}, 
         {productType: req.body}] 
       }, function(err, results) { 
         res.json(results); 
    }); 
} 

とき、私は何も得ませんでした。何か不足していますか?

ご協力いただければ幸いです。ありがとうございました。

UPDATE(FINAL)

は最後にJoydipのと数字のヒントに、このおかげで解決しました。ここでは他のケースの誰かの私の解決策は、私がやったのと同じ問題を取得しますだ:

クライアント側のコントローラ

$scope.searchProduct = function() { 

    if ($scope.searchKeyword == '') { 
     loadFromMongoDB(); // reloads original list if keyword is blank 
    } 
    else { 
     $http.get('/api/products/search/' + $scope.searchKeyword).success(function(data){ 

      if (data.length === 0) { 
       $scope.showNoRec = true; // my flag that triggers "No record found" message in UI 
      } 
      else { 
       $scope.showNoRec = false; 
       $scope.productList = data; // passes JSON search results to UI 
      } 
     });  
    } 
} 

Express.js

app.get('/api/products/search/:keyword', productController.search); // Search for product 

マングーススキーマは

var mongoose = require('mongoose'); 

var schema = new mongoose.Schema({ 
    productName: String, 
    productType: String, 
    productMaker: String, 
    productPrice: Number, 
    createDate: Date, 
    updateDate: Date 
}); 
schema.index({productName: "text", productType: "text", productMaker: "text"}); 

サーバー側コントローラ

module.exports.search = function(req, res) { 

    Product.find({$text: {$search : req.params.keyword}}, function(err, results){ 
     res.json(results); 
    }) 
} 

は、あなたの助けのためのみんなに感謝します。:)

+1

Btw私は、req.params.param'をあなたの検索値に 'req.body'ではないと思っています。 –

+0

お返事ありがとうございます。うん、それも私の間違いの一つだった。 :)それを修正すると、私の検索機能は完全に機能しました。 –

答えて

1

、あなたが使用することができます

db.foodCollection.createIndex({ name: "text", description: "text" }) 

その後、

で検索3210
db.foodCollection.find({ $text: { $search: "choco" } }) 
+0

これは、私のインデックスを 'skin.index({name:" text "、description:" text "});'のように作成しなければならないことを除けば、私のために行いました。さて、大文字と小文字を区別しない正規表現を考慮する必要があります。ありがとうございました! –

+0

** P.S。**これは、大文字と小文字を区別しない検索も解決することを示しています。 1つの石で2羽の鳥!あなたは命を救う人です。ありがとうございました! –

+0

あなたは大歓迎です! – Joy

2
索引作成することで試すことができ

:値を検索することによって、その後

db.yourollection.createIndex({"productName":1,"productType":1}) 

とし、例:あなたはすべてのキーを検索したい場合は

Product.find({$text:{$search: 'Chocolate'}},{productName:1, productType:1}); 
+0

お返事ありがとうございます。 'createIndex'を見るのは初めてのことです。それは何をするためのものか?そして、 'Product.find({$ text:{$ search: 'Chocolate'}}、{productName:1、productType:1});'は、キー名に関係なくすべての一致するレコードを返すでしょうか? –

+0

こんにちは..インデックスは、フィールドへの参照を昇順(1)または降順(-1)のソート順で格納します。上記の例は、そのフィールドへの参照を格納する複合インデックスです。索引が作成されたら、その索引を照会で使用できます。 – digit

関連する問題