MongoDB是否有办法仅使用一个搜索关键字搜索整个集合的密钥内容?
假设我有以下集合(让我们称之为foodCollection):
{
name: "Chocolate Mousse Cake",
type: "Cake"
},
{
name: "Mother's Cookies",
type: "Cookies"
},
{
name: "Dark Bar",
type: "Chocolate"
}
我希望我的搜索能够找到包含“Chocolate”的匹配,这意味着它应该返回“Chocolate Mousse Cake”和“Dark Bar”。
我正在尝试使用ff:code:
执行此操作客户端控制器
// 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);
});
}
当我执行此操作时,我什么也没得到。我错过了什么吗?
非常感谢任何帮助。谢谢。
更新(最终)
最后通过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
Mongoose架构
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);
})
}
谢谢大家的帮助。 :)
答案 0 :(得分:2)
您可以尝试创建索引:
db.yourollection.createIndex({"productName":1,"productType":1})
然后通过搜索值,例如:
Product.find({$text:{$search: 'Chocolate'}},{productName:1, productType:1});
答案 1 :(得分:1)
如果要搜索所有密钥,则可以使用
db.foodCollection.createIndex( { name: "text", description: "text" } )
然后按
搜索 db.foodCollection.find({ $text: { $search: "choco" } })