我在mongodb中有一个集合users
。我正在使用node / mongodb API。
如果我去了我的node.js:
var users = db.collection("users");
然后
users.findOne({ ... })
这是否具有惯用性和效率?
我想避免将所有用户加载到应用程序内存中。
答案 0 :(得分:3)
在Mongo中,collection.find()
会返回cursor
,这是与您的查询匹配的结果的抽象表示。在通过调用cursor.next()
迭代光标之前,它不会通过网络返回结果。在迭代之前,您可以调用cursor.limit(x)
来限制允许返回的结果数。
collection.findOne()
实际上只是collection.find().limit(1).next()
的快捷版本。因此,永远不允许游标返回多于一个结果。
如前所述,collection
对象本身是一个允许访问集合的外观,但它不包含任何实际文档在内存中。
findOne()
非常有效,它确实是惯用的,尽管它在开发/调试中比在实际应用程序代码中更常用。它在CLI中非常有用,但真正的应用程序需要多少次从集合中获取任何一个文档?我能想到的唯一情况是,给定的查询只能返回一个文档(即有效的主键)。
进一步阅读: Cursors, Read Operations
答案 1 :(得分:1)
是的,这应该只将一个用户加载到内存中。
集合对象就是这样,当你创建一个新的集合对象时它不会返回所有用户,只有当你使用findOne
或者从{{的返回值中迭代一个游标时1}}。