2017-05-05 125 views
0

我试图构建查询以实际上有趣的方式与数据库进行交互。其中之一是在一定的年限内搜索文件。我的想法是建立一个聚合管道,在这里我检查是否在搜索表单中选择了年份范围,然后返回匹配的文档。如果未选择范围,则返回所有文档并转到聚合管道的下一个阶段。

这是我曾尝试(只有一个阶段,在aggregate因为我还没有成功地使这第一个工作,至今):

db.collection('archives').aggregate([ 
 
     { $cond: { if: yearStart.length === 4 && yearEnd === 4 }, 
 
     then: { $match: 
 
      { $and: 
 
      [ 
 
       { year: {$gte: yearStart} }, 
 
       { year: {$lte: yearEnd} } 
 
      ] 
 
      } 
 
     }, 
 
     else: { $match: {} } 
 
     } 
 
    ]).toArray((err, docs) => { 
 
     if (err) throw (err) 
 
     res.json(docs) 
 
    })

所以,这不起作用。我收到错误MongoError: A pipeline stage specification object must contain exactly one field.。所以我认为这只是一个附带说明的$cond声明的问题。但不是。我在这里遇到了​​崩溃。所以我想,也许$cond并不意味着像这样使用(返回$match阶段)。我倾向于这样认为,因为文档只显示了一个返回简单值的例子......是不是?

在此先感谢!

+0

聚合管道管道。无条件的。根据用户输入保存应用层的“*,如果在搜索表单中选择了年份范围*”逻辑,并执行不同的查询。 –

回答

1

创建查询对象与$match管道外面与第一本地JavaScript条件语句被用作使用$cond操作者只适用指定流水线级内。在这里你使用 它作为一个流水线步骤,因此引发错误。

考虑以下几点:

const query = { "year": { } }; 
if (yearStart.length === 4 && yearEnd === 4) { 
    query["year"]["$gte"] = yearStart; 
    query["year"]["$lte"] = yearEnd;  
} 

db.collection('archives').aggregate([ { "$match": query } ]).toArray((err, docs) => { 
    if (err) throw (err); 
    res.json(docs); 
}); 

或者使用find()方法

db.collection('archives').find(query).toArray((err, docs) => { 
    if (err) throw (err); 
    res.json(docs); 
}); 
相关问题