一个 ObjectId 的 ObjectId 的 Mongoose 查询数组

Posted

技术标签:

【中文标题】一个 ObjectId 的 ObjectId 的 Mongoose 查询数组【英文标题】:Mongoose query array of ObjectId's for one ObjectId 【发布时间】:2016-06-13 05:24:51 【问题描述】:

尝试查询包含 ObjectId 引用的子文档数组,并找到一项。

这些项目是 ObjectId 的,并在我添加新课程并将其“分配”到特定位置时填充。

这个猫鼬模式说明了我的意思。

var mongoose = require('mongoose');

var lessonNames = new mongoose.Schema(
  day: type: String ,
  name: type: String,
  startTime: type: String,
  endTime: type: String
);

var locationNames = new mongoose.Schema(
  name: type: String, required: true,
  address: String,
  lessons: [  type: mongoose.Schema.Types.ObjectId, ref: 'lessonnames']
);

mongoose.model('lessonnames', lessonNames);
mongoose.model('locationnames', locationNames);

我已在一个位置添加了课程,现在我正在尝试查找此特定课程。我已经尝试了几种方法,但没有一个对我有用。每次当我将查询输出到 console.log 时,我得到一个 null 或 undefined 报告。

      if (location.lessons && location.lessons.length > 0) 
        loc
            .findById(req.params.locationid)
            .populate('lessons', '_id')
              .exec(function (err, myLesson) 
                console.log(myLesson.lessons)
              );

当我执行上述语句时,我看到 nodejs 控制台中生成了以下内容,并启用了 mongoose 调试。

Mongoose: locationnames.findOne( _id: ObjectId("56d4b687c4bcb5681a870cb5") )  fields: undefined   
GET /api/locations/56d4b687c4bcb5681a870cb5/lesson/56d4b687c4bcb5681a870cb4 
Mongoose: lessonnames.find( _id:  '$in': [ ObjectId("56d4b687c4bcb5681a870cb4") ]  )  fields:  _id: 1   

下面的代码行是 console.log 的输出。如您所见,ObjectId 显示为课程数组的一部分。但是我如何进行一个“选择”这个 ObjectId 的查询,以便我可以用它来参考课程。

["_id":"56d4b687c4bcb5681a870cb4"]

在网上搜索,看到一些关于 _id nog 是字符串类型的帖子,我应该将其转换为字符串。但我认为使用 ObjectId 应该是可能的,并且应该很容易查询它,但是我缺乏关于 mongoose 和 mongodb 的良好知识来使其正常工作。

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

请尝试如下,populate 中的_id: "56d4b687c4bcb5681a870cb4" 匹配lessons 数组中的ids

loc.findById(req.params.locationid)
   .populate('lessons', null, _id: "56d4b687c4bcb5681a870cb4")
   .exec(function (err, location) 

   );

【讨论】:

非常感谢zangw!现在就像一个魅力。猜我是在正确的道路上,但是以错误的方式使用 .populate。

以上是关于一个 ObjectId 的 ObjectId 的 Mongoose 查询数组的主要内容,如果未能解决你的问题,请参考以下文章

new ObjectId() 和 new ObjectId 和 ObjectId() 有啥区别?

MongoDb - 要创建一个新的ObjectId,请尝试`Mongoose.Types.ObjectId`而不是使用`Mongoose.Schema.ObjectId`

BSON::ObjectId 与 Mongo::ObjectID

BSON::ObjectId 与 Mongo::ObjectID

Mongoose 不在数组的 objectid 中填充 objectid

MongoDB 查询聚合 localField ObjectId 字符串和外部字段 ObjectId