javascript - 为什么mongodb使用employees[0]、employees[1]、employees[2]与使用employees[i]的for循环输出不同?
问题描述
这是我正在运行的查询:
var employees = db.worksOn.distinct("essn", { $or:[ {'hours': {$gt: 30}, 'pno': 1}, {'hours': {$lte: 20}, 'pno': 2}] }, {'essn': 1, '_id':0} );
for (var i = 0; i < employees.length; i++){
db.employee.find( { 'ssn': employees[i] })
}
代码返回的内容:
{ "_id" : ObjectId("5fc80d0531819bcbd5c3a842"), "fname" : "Joyce", "minit" : "A", "lname" : "English", "ssn" : 453453453, "bdate" : "1962-07-31", "address" : "5631 Rice, Houston, TX", "sex" : "F", "salary" : 25000, "superssn" : 333445555, "dno" : 5 }
以下是各个部分返回的内容:
var employees = db.worksOn.distinct("essn", { $or:[ {'hours': {$gt: 30}, 'pno': 1}, {'hours': {$lte: 20}, 'pno': 2}] }, {'essn': 1, '_id':0} )
employees
[ 123456789, 333445555, 453453453 ]
_
employees.length
3
_
db.employee.find({'ssn': employees[0]})
{ "_id" : ObjectId("5fc80d0531819bcbd5c3a845"), "fname" : "John", "minit" : "B", "lname" : "Smith", "ssn" : 123456789, "bdate" : "1955-01-09", "address" : "731 Fondren, Houston, TX", "sex" : "M", "salary" : 30000, "superssn" : 333445555, "dno" : 5 }
> db.employee.find({'ssn': employees[1]})
{ "_id" : ObjectId("5fc80d0531819bcbd5c3a846"), "fname" : "Franklin", "minit" : "T", "lname" : "Wong", "ssn" : 333445555, "bdate" : "1945-12-08", "address" : "638 Voss, Houston, TX", "sex" : "M", "salary" : 40000, "superssn" : 888665555, "dno" : 5 }
> db.employee.find({'ssn': employees[2]})
{ "_id" : ObjectId("5fc80d0531819bcbd5c3a842"), "fname" : "Joyce", "minit" : "A", "lname" : "English", "ssn" : 453453453, "bdate" : "1962-07-31", "address" : "5631 Rice, Houston, TX", "sex" : "F", "salary" : 25000, "superssn" : 333445555, "dno" : 5 }
为什么使用employees[0]、employees[1]、employees[2]和employees[i]输出的结果不同?答案可能在这两段代码中找到:
for (var i = 0; i < employees.length; i++){ employees[i] }
453453453
for (var i = 0; i < employees.length; i++){
print(employees[i])
}
123456789
333445555
453453453
解决方案
为什么使用employees[0]、employees[1]、employees[2]和employees[i]输出的结果不同?
在这个find
方法 ( db.employee.find( { 'ssn': employees[i] })
) 中,结果是一个游标。请注意, afind
总是返回一个游标并findOne
返回一个文档(或 a null
,如果没有找到匹配的文档)。游标对象可以有零个或多个文档,具体取决于查询过滤器和匹配的文档。
因此,在您的代码中,如果您想打印查询输出的结果db.employee.find( { 'ssn': employees[i] })
,您需要遍历游标。例如,您可以在mongo
shell 中执行此操作:
for (var i = 0; i < employees.length; i++){
var empCur = db.employee.find({ 'ssn': employees[i] });
empCur.forEach(printjson);
}
这将从empCur
. Note cursor 有许多其他方法,您可以根据自己的用例使用其中的任何一种。
参考:
推荐阅读
- lua - Vim 全局变量检查在 lua 中抛出错误(neovim 插件开发)
- python - Python中的并行差分进化
- php - 使用 laravel 将我的 Firebase 实时数据库连接到 MYSQL 数据库表
- c# - C#遍历调用相同函数的类
- java - 如何在 SQliteopenhelper 中更新项目位置
- apache-flink - 表选项不包含选项键“连接器”
- javascript - 如何在不重新渲染 react.js 中的先前消息的情况下渲染新消息?
- html - 我需要使用 CSS 合并垂直和水平文本,如附加的图像
- spring-boot - Spring Boot - 处理 CSV 以及 Excel 多部分文件
- sockets - 无法使用“sudo systemctl status apache2”