选择mongoose模式中的所有字段

时间:2017-03-09 16:44:40

标签: javascript node.js mongodb mongoose

我想获取mongoose中模式的所有字段。现在我使用以下代码:

let Client = LisaClient.model('Client', ClientSchema)
let query = Client.findOne({ 'userclient': userclient })
query.select('clientname clientdocument client_id password userclient')
let result = yield query.exec()

但我想要所有的领域,无论它们是否为空。一如既往,提前谢谢

2 个答案:

答案 0 :(得分:2)

我不确定您是否希望以类似SQL的方式使用所有字段,或者您是否希望以适当的MongoDB方式使用所有字段。

如果你想以适当的MongoDB方式使用它们,那么只需删除query.select行。该行说只返回其中列出的字段。

如果你的意思是SQL,那么MongoDB并不是那样的。每个文档只包含插入时放入的字段。如果在插入文档时,您只给了它某些字段,那么该文档将只包含这些字段,即使其他集合中的其他文档具有不同的字段也是如此。

要确定集合中的所有可用字段,您必须找到所有文档,遍历所有文档并使用您找到的所有不同键构建对象。

如果您需要返回的每个文档始终包含您在选择中指定的字段,则只需在对象返回后对其进行转换。

const fields = ['clientname', 'clientdocument', 'client_id', 'password', 'userclient'];
let Client = LisaClient.model('Client', ClientSchema)
let query = Client.findOne({ 'userclient': userclient })
query.select(fields.join(' '))
let result = yield query.exec()
fields.forEach(field => result[field] = result[field]);

forEach循环会将您想要的所有字段设置为结果中的值(如果它在那里),如果不是,则设置为undefined

答案 1 :(得分:0)

MongoDB是无模式的,没有表,每个集合可以有不同类型的项目。通常,这些对象以某种方式相关或具有共同的基本类型。

使用

回复不定记录

db.collectionName.findOne()db.collectionName.find().pretty()

获取MapReduce所需的所有关键名称

mapReduceKeys = db.runCommand({
  "mapreduce": "collection_name",
  "map": function() {
      for (var key in this) {
          emit(key, null);
      }
  },
  "reduce": function(key, stuff) {
      return null;
  },
  "out": "collection_name" + "_keys"
})

然后在结果集合上运行distinct,以便找到所有键

db[mapReduceKeys.result].distinct("_id") //["foo", "bar", "baz", "_id", ...]