跳过和限制选项 Return Meteor/MongoDB 中为空
Skip and Limit Options Return Null in Meteor/MongoDB
我有一个名为 "general_roasts" 的集合,我正在尝试获取一个随机文档并 return 它。这是 db.general_roasts.find() 的输出:
meteor:PRIMARY> db.general_roasts.find()
{ "_id" : ObjectId("594b389caad4dc3ae16c5f09"), "text" : "roast 11", "contributor" : "" }
{ "_id" : ObjectId("594b38a1aad4dc3ae16c5f0a"), "text" : "roast 12", "contributor" : "" }
{ "_id" : ObjectId("594b38a5aad4dc3ae16c5f0b"), "text" : "roast 13", "contributor" : "" }
{ "_id" : ObjectId("594b38a7aad4dc3ae16c5f0c"), "text" : "roast 14", "contributor" : "" }
{ "_id" : ObjectId("594b38aaaad4dc3ae16c5f0d"), "text" : "roast 15", "contributor" : "" }
这是代码:
import { Mongo } from 'meteor/mongo';
import { Meteor } from 'meteor/meteor';
const Categories = new Mongo.Collection('categories');
const GeneralRoasts = new Mongo.Collection('general_roasts');
console.log("GENERAL ROASTS: " + GeneralRoasts.find().fetch());
Meteor.methods({
'Roasts.random': ({category}) => {
console.log("received random roast request: " + category);
if (category == 'general')
{
let count = GeneralRoasts.find().count();
let index = Math.floor(Math.random() * count);
console.log("count: " + count + " index: " + index);
//var roast = GeneralRoasts.find({skip: index}).fetch();
var roast = GeneralRoasts.find({}, {skip: index, limit: 1});
console.log("returning roast: " + roast.text);
return roast;
}
}
});
Meteor.publish('general_roasts', ()=> {
console.log("published");
return GeneralRoasts.find();
});
Meteor.publish('categories', () => {
return Categories.find();
});
export default GeneralRoasts;
"Roasts.random" 的记录输出是:
received random roast request: general
I20170621-22:02:32.059(-7)? count: 5 index: 4
I20170621-22:02:32.060(-7)? returning roast: undefined
有谁知道为什么 returned 而 "roast 14" 应该 returned?
提前致谢!
正如 Neil Lunn 所说,您应该收到 'roast 15' 而不是 'roast 14'。
{skip: 0, limit: 1} 是 'roast 11',所以 {skip: 4, limit: 1} 将是 'roast 15'
你得到未定义的,因为你没有获取它。
改变
var roast = GeneralRoasts.find({}, {skip: index, limit: 1});
至
var roast = GeneralRoasts.find({}, {skip: index, limit: 1}).fetch();
事实证明 find() 只是 returns 一个游标,所以我不得不使用 GeneralRoasts.find({}, {skip: index, limit: 1}).fetch();
这解决了我的问题!
我有一个名为 "general_roasts" 的集合,我正在尝试获取一个随机文档并 return 它。这是 db.general_roasts.find() 的输出:
meteor:PRIMARY> db.general_roasts.find()
{ "_id" : ObjectId("594b389caad4dc3ae16c5f09"), "text" : "roast 11", "contributor" : "" }
{ "_id" : ObjectId("594b38a1aad4dc3ae16c5f0a"), "text" : "roast 12", "contributor" : "" }
{ "_id" : ObjectId("594b38a5aad4dc3ae16c5f0b"), "text" : "roast 13", "contributor" : "" }
{ "_id" : ObjectId("594b38a7aad4dc3ae16c5f0c"), "text" : "roast 14", "contributor" : "" }
{ "_id" : ObjectId("594b38aaaad4dc3ae16c5f0d"), "text" : "roast 15", "contributor" : "" }
这是代码:
import { Mongo } from 'meteor/mongo';
import { Meteor } from 'meteor/meteor';
const Categories = new Mongo.Collection('categories');
const GeneralRoasts = new Mongo.Collection('general_roasts');
console.log("GENERAL ROASTS: " + GeneralRoasts.find().fetch());
Meteor.methods({
'Roasts.random': ({category}) => {
console.log("received random roast request: " + category);
if (category == 'general')
{
let count = GeneralRoasts.find().count();
let index = Math.floor(Math.random() * count);
console.log("count: " + count + " index: " + index);
//var roast = GeneralRoasts.find({skip: index}).fetch();
var roast = GeneralRoasts.find({}, {skip: index, limit: 1});
console.log("returning roast: " + roast.text);
return roast;
}
}
});
Meteor.publish('general_roasts', ()=> {
console.log("published");
return GeneralRoasts.find();
});
Meteor.publish('categories', () => {
return Categories.find();
});
export default GeneralRoasts;
"Roasts.random" 的记录输出是:
received random roast request: general
I20170621-22:02:32.059(-7)? count: 5 index: 4
I20170621-22:02:32.060(-7)? returning roast: undefined
有谁知道为什么 returned 而 "roast 14" 应该 returned?
提前致谢!
正如 Neil Lunn 所说,您应该收到 'roast 15' 而不是 'roast 14'。
{skip: 0, limit: 1} 是 'roast 11',所以 {skip: 4, limit: 1} 将是 'roast 15'
你得到未定义的,因为你没有获取它。
改变
var roast = GeneralRoasts.find({}, {skip: index, limit: 1});
至
var roast = GeneralRoasts.find({}, {skip: index, limit: 1}).fetch();
事实证明 find() 只是 returns 一个游标,所以我不得不使用 GeneralRoasts.find({}, {skip: index, limit: 1}).fetch();
这解决了我的问题!