【问题标题】:mongoose: myModel.find always return subdocument猫鼬:myModel.find 总是返回子文档
【发布时间】:2013-02-27 14:25:23
【问题描述】:
  var myschema  = new Schema({
      name: {type:String, default:'fullname'},
      subdoc: {
          day1: {type:Array, default:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},
          day2: {type:Array, default:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
      }
  });
  var mymodel = Mongoose.model('mytest',myschema);
  //mongoose 3.5.6: find
  mymodel.find({},{'name'}, function(err,docs){
      logger.info("---> " + docs);
  });

结果:

---> { _id: 512da190ba48050f2e000001, **subdoc: {}**, name: 'fullname' }

仅请求返回name 字段,但此函数始终返回subdoc: {}。有人可以解释一下吗?

使用 mongodb shell,看起来不错

db.mytests.find({},{"name":1})
{ "_id" : ObjectId("512da190ba48050f2e000001"), "name" : "fullname" }

然后我将模型更改为:

var myschema  = new Schema({
          name: {type:String, default:'fullname'},
          subdoc: [
              day1: {type:Array, default:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},
              day2: {type:Array, default:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
          ] // **note: not {} here**
      })

使用同样的mongoose api find,结果正是我所期望的:

--->{ _id: 512da46fffebd24b30000002, name: 'fullname' }

我的问题是:为什么字段“subdoc”与以前的架构一起返回?

【问题讨论】:

    标签: find mongoose


    【解决方案1】:

    按照the docs的说法,看来你有点离题了。

    例子:

    // name LIKE john 只选择“name”和“friends”字段,立即执行 MyModel.find({ name: /john/i }, 'name friends', function (err, docs) { })

    有了这个,我会做这样的事情:

    myModel.find({}, 'name', 回调);

    编辑

    解决您的 cmets:在 mongodb 控制台中,格式化它的正确方法是 {'name':1, 'friend':1}。使用:

    db.collection.find({}, {'namefriend'})

    会抛出一个错误。要正确执行此操作,您可以:

    db.collection.find({}, {'name':1, 'friend':1})

    但是,如果您更喜欢这种字段选择方式,mongoose 也允许您这样做。

    myModel.find({}, {'name':1, 'friend': 1}, 回调);

    见:API Docs

    【讨论】:

    • 感谢回复,可以使用{'namefriend'}。当我使用 mongodb shell 时,不会出现这个问题。所以我很好奇为什么这会发生在猫鼬身上?
    • 我不确定我是否在关注你。您询问了如何使用 mongoose 仅​​返回名称字段。我根据文档解释了正确的方法。然后你问,为什么返回子文档。使用最新的 Mongoose,并使用您的代码 myModel.find({},{'name'},callback);我有一个错误。你有什么我没有回答的问题?你用的是什么版本的猫鼬?
    • 谢谢,但我认为我们说的不是同一件事。我的意思是当我使用 find 时,结果如下:{id:xxxxx,name:xxxxx,subdoc:{}},但我根本没有请求“subdoc”。然后在 mongodb shell 上使用相同的命令,它工作正常,结果正是我想要的:{id:xxxx,name:xxxx}。然后我将此模型(subdoc 字段)修改为:'subdoc: [day1:{xxx},day2:{xxxxx}]'。 (注意:起源是:subdoc:{...},而不是 subdoc:[...])它在 mongoose 和 mongodb shell 上都可以正常工作。所以我想知道为什么会这样,为什么会返回字段“subdoc”?
    • mongodb版本:2.2.3;猫鼬版本:3.5.6
    猜你喜欢
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2018-08-28
    • 2022-11-22
    • 2015-01-06
    • 2020-04-26
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多