首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬查找和findOne返回整个集合

猫鼬查找和findOne返回整个集合
EN

Stack Overflow用户
提问于 2017-12-28 20:39:18
回答 1查看 207关注 0票数 0

我在javascript中有下面的代码,数据库已经被填充。现在,当我使用find()findOne()时,Mongoose会返回6000多个条目的整个集合。为什么过滤器没有发生?

代码语言:javascript
复制
var tickerIDSchema = new mongoose.Schema({
  ticker: String,
  name: String,
  exchange: String,
  "_id": false
});

var tickerListSchema = new mongoose.Schema({
  complete: [tickerIDSchema]
});

tickerListSchema.index(
  { "complete.ticker": 1, "complete.exhcange": 1 },
  { unique: true }
);

var tickerList = mongoose.model("tickerList", tickerListSchema);


tickerList.findOne({"complete.ticker": "BMO"}, function(err, data){

  console.log(data)
})

结果:

代码语言:javascript
复制
{ _id: 5a44452bb1dac235f039c66c,
  __v: 0,
  complete:
   [ { ticker: 'AAPL', name: 'Apple Inc.', exchange: 'Nasdaq' },
     { exchange: 'Amex',
       name: 'Altisource Asset Management Corp',
       ticker: 'AAMC' },
     { exchange: 'Amex',
       name: 'Almaden Minerals, Ltd.',
       ticker: 'AAU' },
     { exchange: 'Amex',
       name: 'Aberdeen Emerging Markets Smaller Company Opportunities Fund I',
       ticker: 'ABE' },
     { exchange: 'Amex',
       name: 'Acme United Corporation.',
       ticker: 'ACU' },
     { exchange: 'Amex', name: 'AeroCentury Corp.', ticker: 'ACY' },
     { exchange: 'Amex',
       name: 'Adams Resources & Energy, Inc.',
       ticker: 'AE' },
     { exchange: 'Amex', name: 'Ashford Inc.', ticker: 'AINC' },
     { exchange: 'Amex',
       name: 'Air Industries Group',
       ticker: 'AIRI' },
     ... 6675 more items ] }
EN

回答 1

Stack Overflow用户

发布于 2017-12-28 21:11:32

您似乎有一个额外的抽象层,这是不必要的。

这段代码有效地创建了一个具有单个属性的文档。

代码语言:javascript
复制
var tickerListSchema = new mongoose.Schema({
  complete: [tickerIDSchema]
});

结果是,mongodb集合tickerList中只有一个文档,其中包含了该属性complete中的所有数据。根据mongodb文档(https://docs.mongodb.com/manual/reference/method/db.collection.findOne/),findOne应该返回匹配的文档。因为您是在查询子文档,所以返回的结果是父文档,它包含tickerIDSchema中的所有数据。

为了达到你想要的结果,你的猫鼬代码应该是这样的。

代码语言:javascript
复制
var tickerIDSchema = new mongoose.Schema({
  ticker: String,
  name: String,
  exchange: String,
  "_id": false
});

tickerIDSchema.index(
  { "ticker": 1, "exchange": 1 },
  { unique: true }
);

var tickerList = mongoose.model("tickerList", tickerIDSchema);

tickerList.findOne({"ticker": "BMO"}, function(err, data){
  console.log(data)
})

删除tickerListSchema将允许您直接查询tickerIDSchemafindOne()查询将如图所示,find()应按以下方式操作:

代码语言:javascript
复制
tickerList.find({}, function(err, data){
    console.log(data)
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48014083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档