Mongodb查找查询

时间:2015-11-24 10:37:15

标签: mongodb mongodb-query

我要求我需要搜索集合中动态的字段 示例如下所示,我想在一个集合中搜索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"        
    }
}

请建议我查询以产生如上所述的结果。

2 个答案:

答案 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);
        }
    });
};

在这种情况下,您不需要将查询设置为静态,无论是什么来自冻结,只需使用密钥和值并过滤数据。 希望它适合你。

快乐编码!!!