mongoDB 和 sails aggregate 不与 nodejs 一起工作
mongoDB and sails aggregate dont work with nodejs
我正在使用 mongodb 和 sails 框架,Production.find({}) 工作正常
但是 Production.aggregate([]) 返回错误
Production.aggregate() is not a function
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});
});
}
};
对于聚合,您需要先调用 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
});
}
});
从 Sails v1.0 开始,.native() 方法已弃用,取而代之的是 getDatastore().manager。
https://sailsjs.com/documentation/reference/waterline-orm/models/native
由于当前版本的 sails-mongo (v1.0.1) 不支持新的必需游标方法的错误,我实际上已经切换到使用 Mongo 查看管理聚合查询。
下面的模式 "supposed" 可以工作,但目前 returns 没有结果,因为目前没有正确支持 aggregate() 函数的 toArray() 。它 returns 一个不支持 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 数据库视图中,并根据需要添加了额外的列以支持 filter/match 功能。我没有放入 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
});
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));
});
我正在使用 mongodb 和 sails 框架,Production.find({}) 工作正常 但是 Production.aggregate([]) 返回错误
Production.aggregate() is not a function
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});
});
}
};
对于聚合,您需要先调用 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
});
}
});
从 Sails v1.0 开始,.native() 方法已弃用,取而代之的是 getDatastore().manager。
https://sailsjs.com/documentation/reference/waterline-orm/models/native
由于当前版本的 sails-mongo (v1.0.1) 不支持新的必需游标方法的错误,我实际上已经切换到使用 Mongo 查看管理聚合查询。
下面的模式 "supposed" 可以工作,但目前 returns 没有结果,因为目前没有正确支持 aggregate() 函数的 toArray() 。它 returns 一个不支持 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 数据库视图中,并根据需要添加了额外的列以支持 filter/match 功能。我没有放入 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
});
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));
});