使用Node读取MongoDB
使用Node读取MongoDB
我想查询一个MongoDB并console.log一些数据。在这一点上,任何数据都可以。MongoDB中的记录有很多属性,但为了保持简单,我只引用了一个属性;我不知道这是否会引起问题。此外,我的集合名为'data',而不是'datas',所以我正在尝试强制Mongo使用'data'。集群:stocks,集合:data。
我意识到查询应该是多么简单,但我还没有成功在node中从这个数据库中打印出任何内容。在此之前,我一直使用python来填充数据库。
var mongoose = require('mongoose'); var url = 'mongodb://<用户名>:<密码>@stocks-shard-00-00-rtpdz.mongodb.net:27017,stocks-shard-00-01-rtpdz.mongodb.net:27017,stocks-shard-00-02-rtpdz.mongodb.net:27017/test?ssl=true&replicaSet=stocks-shard-0&authSource=admin' mongoose.connect(url, { useMongoClient: true }) var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function() { // 我们已连接! var stockSchema = mongoose.Schema({ Symbol: String }); var data = mongoose.model('data', stockSchema); data.find(function (err, stocks) { if (err) return console.error(err); console.log(stocks); }) });
这将返回:
[]
这是一个用python查询的示例记录:
{u'Date': datetime.datetime(2017, 12, 22, 0, 0), u'Symbol': u'ADSK', u'_52w_high': u'-20.35%', u'_52w_low': u'41.88%', u'_52w_range': u'73.60 - 131.10', u'_id': ObjectId('5a3d22b24a579477f9f7ce91'), u'analystrec': u'2.00', u'atr': u'2.99', u'avg_vol': u'2.15M', u'beta': u'1.92', u'bookvalpershare': u'0.49', u'cashpershare': u'6.62', u'change': u'-0.01%', u'currratio': u'1.10', u'debt_to_eqty': u'14.78', u'dividend': u'-', u'earnings': u'Nov 28 AMC', u'employees': u'9000', u'eps': u'-2.57', u'eps_growth_nxt_y': u'1.22', u'eps_nxt_5y': u'26.00%', u'eps_nxt_q': u'-0.12', u'eps_nxt_yr': u'1.22', u'eps_past_5y': u'-32.80%', u'eps_qq': u'15.10%', u'eps_this_yr': u'-78.70%', u'finalAnswer': 2, u'finalQuote': 0, u'forwpe': u'85.32', u'gross_margin': u'84.20%', u'income': u'-566.80M', u'insider_trans': u'-28.35%', u'insiders_own': u'0.30%', u'inst_own': u'98.10%', u'inst_trans': u'1.13%', u'lt_debt_to_eqty': u'14.78', u'marketcap': u'22.93B', u'oper_margin': u'-24.90%', u'optionable': u'Yes', u'payout': u'-', u'pb': u'213.12', u'pc': u'15.77', u'pe': u'-', u'peg': u'-', u'perf_half_yr': u'-3.08%', u'perf_m': u'-18.23%', u'perf_q': u'-6.58%', u'perf_wk': u'-1.71%', u'perf_yr': u'38.08%', u'perf_ytd': u'41.10%', u'pfcf': u'-', u'prev_close': u'104.43', u'price': u'104.42', u'profit_margin': u'-18.23%', u'ps': u'11.57', u'quickratio': u'1.10', u'rel_vol': u'0.84', u'roa': u'-12.80%', u'roe': u'-136.20%', u'roi': u'-25.10%', u'rsi_14': u'31.00', u'sales': u'1.98B', u'sales_past_5y': u'-1.70%', u'sales_qq': u'5.20%', u'short_float': u'2.40%', u'short_ratio': u'2.45', u'shortable': u'Yes', u'shs_float': u'219.48M', u'shs_outst': u'219.60M', u'sma20': u'-5.51%', u'sma200': u'-2.34%', u'sma50': u'-11.46%', u'target_price': u'132.00', u'volatility': u'2.07% 2.67%', u'volume': u'212,785'}
问题的原因是使用mongoose连接mongodb时没有设置useMongoClient选项,解决方法是设置useMongoClient选项为true。
默认情况下,mongodb的集合名是复数形式,所以导致集合名为datas而不是data。
问题已修复,谢谢。是的,这是默认设置,但我读过可以强制设置。我需要强制设置。
我实现了这里的答案来强制使用"data"集合:stackoverflow.com/questions/10547118/… ...但仍然返回[ ]。
你确定数据库中的data集合中有记录吗?
是的,我确定有记录,因为我每天都用Python查询它。我刚刚进行了查询的双重检查。
在Python中,我使用相同的链接进行连接,但是我还必须像这样指定数据库:db=client.stocks。链接中有"stocks",但也许我需要明确告诉JavaScript使用"stocks"。
你可以分享你使用的mongodb_url的最后一部分吗?
我把数据放在一个"datas"集合中,但仍然返回[ ]。
问题出在链接上。在链接的最后部分,可以将数据库放在"test"附近:'...mongodb.net:27017/test?ssl=true&replicaSet=stocks-shard-0&authSource=admin',当我将"test"改为"stocks"时,问题解决了。
太棒了!恭喜Randy。