我要求我需要搜索集合中动态的字段 示例如下所示,我想在一个集合中搜索title =" Toshiba Satellite Pro 4600 PIII800"但标题将随文档的不同而变化。
第一个文件标题是指" xyz"这是该文件的标题。
第二个文件标题是指" abc"这是该文件的标题。
{
"_id" : ObjectId("5640bdec1b988de0be31724e"),
"xyz" : "Toshiba Satellite Pro 4600 PIII800",
"mappingData" : {
"title" : "xyz"
},
"_id" : ObjectId("5640bdec1b9435dfgdf43554b"),
"abc" : "Toshiba Satellite Pro 4600 PIII800",
"mappingData" : {
"title" : "abc"
}
}
请建议我查询以产生如上所述的结果。
答案 0 :(得分:0)
首先获取所有mappingData
标题的明确列表,您可以使用集合中的 distinct(
)方法执行此操作。使用该列表,您可以构建要在 find()
方法中使用的查询对象。理想情况下,您需要在查询查询中使用 $or
运算符。通常,您的查找查询类似于:
db.collection.find({
"$or": [
{ "xyz" : "Toshiba Satellite Pro 4600 PIII800" },
{ "abc" : "Toshiba Satellite Pro 4600 PIII800" }
]
})
因此,您需要一种机制来生成上述查询,以下示例演示了此方法:
var titles = db.collection.distinct("mappingData.title"),
titleVal = "Toshiba Satellite Pro 4600 PIII800",
query = { "$or": [] };
query["$or"] = titles.map(function (t){
var q = {};
q[t] = titleVal;
return q;
});
db.collection.find(query);
<强>输出强>:
/* 0 */
{
"_id" : ObjectId("56543f577d3c273d063cd226"),
"xyz" : "Toshiba Satellite Pro 4600 PIII800",
"mappingData" : {
"title" : "xyz"
}
}
/* 1 */
{
"_id" : ObjectId("56543f577d3c273d063cd227"),
"abc" : "Toshiba Satellite Pro 4600 PIII800",
"mappingData" : {
"title" : "abc"
}
}
答案 1 :(得分:-1)
/** search query */
exports.search = function(req, res) {
var query = {};
for(var key in req.body){
query[key] = req.body[key];
}
Collection.find(query)
.exec(function(err, result) {
if (!err) {
console.log(result);
}
}
else {
console.log(err);
}
});
};
在这种情况下,您不需要将查询设置为静态,无论是什么来自冻结,只需使用密钥和值并过滤数据。 希望它适合你。
快乐编码!!!