2015-11-24 88 views
0

我有需要像我需要搜索集合中的动态字段。
示例如下所示在一个集合中我想搜索title =“Toshiba Satellite Pro 4600 PIII800”,但标题将从文档更改为文档。Mongodb找到查询

第一个文件标题是指“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

首先获得所有mappingData标题的不同列表,你可以做到这一点使用上的集合distinct()方法。通过该列表,您可以构建查询对象,以便在方法中使用该查询对象。理想情况下,您需要在查找查询中使用$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" 
    } 
} 
+0

谢谢chridam。我试过了你的查询,但它返回的错误如下所示。 错误:{ \t “$ ERR”: “无法规范化查询:$的badValue和/或$/$,也必须是一个非空阵”, \t “代码”:17287 } –

+0

当你运行'分贝.collection.distinct(“mappingData.title”)'你会得到什么,当然用你的实际集合名称替换集合? – chridam

+0

对不起,这是我的错误。现在它工作,但不是我所期望的。 将这项工作即使对于一个映射数据也喜欢 { “_id”:物件( “5640bdec1b988de0be31724e”), “XYZ”: “东芝Satellite Pro的4600 PIII800”, “mappingData”:{ “称号” : “XYZ” }, “_id”:物件( “5640bdec1b9435dfgdf43554b”), “XYZ”: “东芝Satellite Pro的4600 PIII800”, “mappingData”:{ “称号”: “XYZ” } } –

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

在这种情况下,你不需要让你的问题ry静态的,无论是来自何处,只是使用键和值并过滤数据。 希望它适合你。

快乐编码!

+0

我不确定我可以如何将它用于我的场景。你能用我的用例来解释我吗? –

+0

您只需将数据传递到请求身上,如 {“xyz”:“Toshiba Satellite Pro 4600 PIII800” } –