如何在javascript(meteor.js)中操作返回的mongo集合/游标?

时间:2013-05-22 03:01:22

标签: javascript mongodb coffeescript meteor

在使用Meteor.js和Mongo时,我使用find({一些参数}),有时会找到({一些参数})。fetch()返回游标和一系列匹配文档。

两者之间真正的区别是什么? (我什么时候使用一个?另一个?)

对这些类型的返回对象进行操作/迭代的正确方法是什么?

E.g。 我有一个集合,其中包含许多文档,每个文档都有一个标题字段。

我的目标是获取所有标题字段值的数组,例如[doc1title,doc2title,doc3title]

我这样做了:

var i, listTitles, names, _i, _len;
names = Entries.find({}).fetch();
listTitles = [];
for (_i = 0, _len = names.length; _i < _len; _i++) {
    i = names[_i];
    listTitles.push(i.title);
}

或coffeescript中的等价物

names = Entries.find({}).fetch()
listTitles = []
for i in names
    listTitles.push(i.title)

有效,但我不知道它是正确的方式,还是半合理的方式。

2 个答案:

答案 0 :(得分:14)

您的第一个问题已被提问before - 另请参阅this帖子。简短的回答是你想要使用find返回的光标,除非你真的需要所有的数据,以便在将它发送到模板之前对其进行操作。

您的CoffeeScript可以改写为:

titles = (entry.title for entry in Entries.find().fetch())

如果您使用下划线,它也可以写成:

titles = _.pluck Entries.find().fetch(), 'title'

答案 1 :(得分:10)

要在js中迭代光标,只需使用cursor.forEach

const cursor = Collection.find();
cursor.forEach(function(doc){
  console.log(doc._id);
});

将游标转换为数组时,您还会发现.map()函数很有用:

const names = Entries.find();
let listTitles = names.map(doc => { return doc.title });