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

时间:2011-04-24 20:16:13

标签: mongodb node.js express mongoose

对于这个应用程序,我使用Node.js,MongoDB,Mongoose&快速

所以我有一个Param对象,其中包含一组Pivots,我想从枢轴中读取某些数据,如下所述

---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),因为我有一个带有正确的pivot文档的doc集合。

然而,似乎没有一种find方法让我通过模式中定义的'value'属性匹配嵌入文档。是否可以使用.find()或.findOne()搜索这个嵌入文档数组,如果没有,是否有一些通过mongoose访问它的简单方法?

5 个答案:

答案 0 :(得分:3)

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

请注意查询的复数形式以匹配架构中的字段名称

答案 1 :(得分:2)

您可以使用以下嵌入式文档属性进行查询:

{'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();
               });
});

答案 2 :(得分:0)

我认为您正在寻找“$ in”关键字?

如:

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

来源:MongoDB Queries CheatSheet

答案 3 :(得分:0)

我使用一个简单的for循环来解析它,以解析对象数组,如下所示:

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

但是,我仍然认为Mongoose必须有一种更简单的方式与嵌入式文档交互 - 这种循环有点慢,特别是当嵌入式文档的数量变大时。

如果有人建议以更快的方式在js或mongoose函数中搜索此对象数组,请在下面发布。

答案 4 :(得分:0)

这个问题的最大问题是,如果你的req有一些空字段(应该充当通配符),你就找不到任何东西,因为mongo也试图匹配空参数,所以搜索{&#34; user&# 34;:&#34; bob&#34;,&#34; color&#34;:&#34;&#34;}与{&#34; user&#34;:&#34; bob& #34;,&#34;颜色&#34;:&#34;红色&#34;}或{&#34;用户&#34;:&#34; bob&#34;}。这意味着您必须首先创建一个查询对象并在传入之前过滤掉任何未使用的参数,如果您创建了一个查询对象,则不能再执行类似&#34; user.name = ...& #34;因为mongo将此作为错误进行交互,因为它不首先将对象文字解析为字符串。 关于这个问题的任何想法?

PS。你认为制作一个像这样的对象很容易: user.name =&#34;摆锤&#34 ;; user.color:&#34;绿色&#34 ;; user.signup.time =&#34; 12342561&#34; 然后只使用user作为查询对象:/