6

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

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

---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() 或 .findOne() 搜索这个嵌入文档数组,如果没有,是否有一些简单的方法可以通过 mongoose 访问它?

4

5 回答 5

3

瓦伦斯林,

这应该这样做

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

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

于 2011-05-09T02:56:17.163 回答
1

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

{'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();
               });
});
于 2011-04-27T19:04:33.567 回答
0

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

如:

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

来源:MongoDB 查询备忘单

于 2011-04-25T17:46:56.323 回答
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 函数中更快地搜索此对象数组有任何建议,请在下面发布。

于 2011-04-25T23:35:49.820 回答
0

最大的问题是,如果您的 req 有一些字段为空(应该充当通配符),您将找不到任何内容,因为 mongo 也尝试匹配空参数,因此搜索 {"user":"bob", " color":""} 与 {"user":"bob"、"color":"red"} 或 {"user":"bob"} 不同。这意味着您必须首先创建一个查询对象并在传入之前过滤掉任何未使用的参数,并且如果您创建了一个查询对象,则不能再执行诸如“user.name = ...”之类的操作,因为mongo interperets这是一个错误,因为它不会首先将对象文字解析为字符串。关于这个问题的任何想法?

附言。你会认为制作这样的对象很容易: user.name="bob"; 用户颜色:“绿色”;user.signup.time="12342561" 然后只使用 user 作为查询对象:/

于 2015-06-01T15:33:01.293 回答