我正在使用mongodb和sails框架,Production.find({})正常工作 但是Production.aggregate([])返回错误
Production.aggregate()不是函数
module.exports = {
list : function(req,res) {
Production.aggregate([{
$project: {
data: { $substr: ["$pt",0,10] },
prodTempo: { $substr: ["$sis",0,10]}
}
}])
.exec(function(err,collection ){
if(err){
res.send(500,{error:"DataBase Error"});
}
res.view('list',{producao:collection});
});
}
};
答案 0 :(得分:2)
对于聚合,您需要先调用native
函数。然后它看起来像这样:
const aggregateArray = [
{
$project: {
data: { $substr: ['$pt', 0, 10] },
prodTempo: { $substr: ['$sis', 0, 10] }
}
}
];
Production.native(function(err, prodCollection) {
if (err) {
// handle error 1
} else {
prodCollection
.aggregate(aggregateArray)
.toArray((err, results) => {
if (err) {
// handle error 2
}
// Do something with your results
});
}
});
答案 1 :(得分:2)
从Sails v1.0开始,不建议使用.native()方法,而推荐使用getDatastore()。manager。
https://sailsjs.com/documentation/reference/waterline-orm/models/native
由于当前版本的sails-mongo(v1.0.1)中存在一个错误,该错误不支持新的必需游标方法,因此我实际上已切换为使用Mongo View来管理聚合查询。
下面的模式“应该”可以工作,但是由于未正确支持Aggregate()函数的toArray()而目前未返回任何结果。它返回一个不支持toArray()方法的AggregateCursor。
我打算做什么
const myView = sails.getDatastore()。manager.collection(“ view_name”);
myView.find({...match/filter criteria...}).toArray((err, results) => {
if (err) {
// handle error 2
}
// Do something with your results
});
我将整个聚合查询放入Mongo DB视图,并添加了其他列以根据需要支持过滤/匹配功能。我没有放入Mongo中的“ match”的唯一部分是我在上面的find()方法中使用的动态字段。这就是您需要其他字段的原因,因为find()仅查询查询中可用的列,而不查询基础模型
应该做什么
因此汇总模式现在如下:
const aggregateArray = [
{
$project: {
data: { $substr: ['$pt', 0, 10] },
prodTempo: { $substr: ['$sis', 0, 10] }
}
}
];
sails.getDatastore('name of datastore').manager.collection('collection name')
.aggregate(aggregateArray)
.toArray((err, results) => {
if (err) {
// handle error 2
}
// Do something with your results
});
答案 2 :(得分:0)
const regexForFileName = '.*' + fileName + '.*';
var db = model.getDatastore().manager;
var rawMongoCollection = db.collection(model.tableName);
rawMongoCollection.aggregate(
[
{
$project : {
"_id" : 0,
"fileId" : 1,
"fileName" : 1,
"fileSize" : 1,
"createdTime" : 1
}
},
{
$match : {
"fileName" : {
$regex: regexForFileName,
$options: 'i'
}
}
},
{
$sort: {
"createdTime" : -1
}
},
{
$skip: pageNumber * numberOfResultsPerPage
},
{
$limit: numberOfResultsPerPage
}
]
).toArray((err, results) => {
if (err) {
console.log(err);
}
console.log("results: " + JSON.stringify(results));
});