通过Mongoose,Node.js,MongodDB中的特定属性查找embedded式文档

对于这个应用程序,我使用Node.js,MongoDB,Mongoose和Express

所以我有一个Param对象,它包含一个Pivot数组,我想从下面概述的枢轴读取某些数据

---in models.js------------------------- var Pivot = new Schema({ value : String , destination : String , counter : Number }); var Param = new Schema({ title : String , desc : String , pivots : [Pivot] }); ------------- in main.js -------------- var Param = db.model('Param'); app.get('/:title/:value', function(req, res){ Param.findOne({"title":req.param('title')}, function(err, record){ console.log(record.pivots); record.pivots.find({"value":req.param('value')}, function(err, m_pivot){ pivot.counter++; res.redirect(m_pivot.destination); }); record.save(); }); }); 

我知道该代码的作品,直到console.log(record.pivots),因为我有一个文档集合里面的正确的透视文件。

但是,似乎没有一个find方法让我通过模式中定义的“value”属性匹配embedded的文档。 是否有可能使用.find()或.findOne()search这个embedded式文件的数组,如果没有,有没有简单的方法来通过mongoose访问它?

       

网上收集的解决方案 "通过Mongoose,Node.js,MongodDB中的特定属性查找embedded式文档"

varunsrin,

这应该做到这一点

 app.get('/:title/:value', function(req, res) { Param.findOne({'pivots.value': req.param('value'), "title":req.param('title')}}, function(err, record) { record.pivot.counter++; res.redirect(m_pivot.destination); record.save(); }); }); 

请注意查询的复数forms以匹配模式中的字段名称

您可以使用像这样的embedded式文档属性来查询:

 {'pivot.value': req.param('value')}} 

更新回应评论:

 app.get('/:title/:value', function(req, res) { Param.findOne({'pivot.value': req.param('value'), "title":req.param('title')}}, function(err, record) { record.pivot.counter++; res.redirect(m_pivot.destination); record.save(); }); }); 

我用一个简单的for循环来解决它暂时parsing对象数组,如下所示:

 for (var i=0; i <record.pivots.length; i++){ if (record.pivots[i].value == req.param('value')){ res.redirect(record.pivots.destination); } } 

不过,我仍然认为Mongoose必须有一个更简单的方式来与embedded式文档进行交互 – 而且这个循环有点慢,特别是当embedded式文档的数量增长的时候。

如果任何人有任何build议,以更快的方式来search这个对象数组在js或与mongoosefunction,请张贴在下面。

最大的问题是,如果你的req有一些空的字段(这应该作为通配符),你不会find任何东西,因为mongo试图匹配空的参数,所以search{“user”:“bob”,“颜色“:”“}与{”user“:”bob“,”color“:”red“}或{”user“:”bob“}不一样。 这意味着你必须首先创build一个查询对象,并在传入之前过滤掉所有未使用的参数,如果你创build了一个查询对象,你不能再像“user.name = …”那样做,因为mongo interperets这是一个错误,因为它不会首先将对象字面parsing为一个string。 关于这个问题的任何想法?

PS。 你会认为这将是很容易的,使一个对象像:user.name =“bob”; user.color: “绿色”; user.signup.time =“12342561”,然后只使用用户作为查询对象:/

我想你正在寻找“$ in”关键字?

如:

 {a: {$in: [10, "hello"]}} 

源: MongoDB查询CheatSheet