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

Posted

技术标签:

【中文标题】如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?【英文标题】:how to manipulate returned mongo collections / cursors in javascript (meteor.js)? 【发布时间】:2013-05-16 23:24:07 【问题描述】:

在使用 Meteor.js 和 Mongo 时,我使用 find(some arguments) 有时使用 find(some arguments).fetch() 返回游标和匹配文档的数组。

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

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

例如 我有一个包含许多文档的集合,每个文档都有一个标题字段。

我的目标是获取所有标题字段值的数组,例如[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);

或咖啡脚本中的等价物

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

这行得通,但我不知道它是正确的方式还是半理智的方式。

【问题讨论】:

【参考方案1】:

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

您的 CoffeeScript 可以重写为:

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

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

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

【讨论】:

感谢流星文档的链接。附带说明一下,为什么在普通 Mongo 中调用 toArray() 时,他们发明了名称 fetch() 来从游标创建数组。我花了好一阵子才发现我拥有的不是普通的 Mongo 光标,而是流星变体。【参考方案2】:

要在 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 );

【讨论】:

以上是关于如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?的主要内容,如果未能解决你的问题,请参考以下文章

main.* 中的 Meteor JS javascript 文件仍然无法正确加载。加载顺序的最佳实践?

使用 Meteor.js 的桌面应用程序

meteor.js - 如何检查来自异步回调的值

如何从Meteor.js中的方法内部的方法返回错误

如何在 Meteor 1.0 中使用 jQuery

Meteor JS:使用外部脚本