在子文档 MongoDB 中检索数组
Posted
技术标签:
【中文标题】在子文档 MongoDB 中检索数组【英文标题】:Retrieve Array in Subdocument MongoDB 【发布时间】:2016-12-29 06:19:34 【问题描述】:我有一个类似这样的用户模型结构:
const userSchema = new mongoose.Schema(
email: type: String, unique: true ,
password: String,
todosDo: [models.Do.schema],
子“Do”模式有点像这样(在不同的文件中):
const doSchema = new mongoose.Schema(
name: type: String, default : '',
user: type: mongoose.Schema.ObjectId, ref: 'User',
createdAt: type : Date, default : Date.now
);
我正在尝试弄清楚如何为登录用户检索 todosDo 数组。这是我到目前为止所得到的:
// Get all "Do" todos from DB
// Experimenting to find todos from certain user
User.findById(req.user.id, function(err, user)
if(err)
console.log(err);
else
doTodos = user.todosDo, // this obviously doesn't work, just an idea of what I was going for
console.log(doTodos);
finished();
);
我是错误地引用了孩子/父母还是我没有正确检索数组?非常感谢任何帮助!
【问题讨论】:
users.todosDo
后面的逗号实际上在您的代码中吗?如果是,您无意中将doTodos
设置为console.log()
,即undefined
。
@Mike 是,但我在从 DB 获取所有“Do”待办事项之前定义了这样的 doTodos:var doTodos = ;
。还是你说的不是这个?
【参考方案1】:
我猜你可能想编辑为原始 js 对象,所以你需要使用lean()
函数。不使用 lean()
函数 user 是猫鼬对象,所以你不能修改它。
可以试试这个:
User.findById(req.user.id)
.lean()
.exec(function (err, user)
if(err)
console.log(err);
return res.status(400).send(msg:'Error occurred');
if(!user)
return res.status(400).send(msg:'User Not found');
doTodos = user.todosDo;
console.log(user.todosDo); // check original todos
console.log(doTodos);
return res.status(200).send(doTodos : doTodos ); // return doTodos
);
要从不同的模型中引用父架构中的子架构,您可以通过其schema
属性访问模型的架构。
在doSchema.js
文件中说
const doSchema = new mongoose.Schema(
name: type: String, default : '',
user: type: mongoose.Schema.ObjectId, ref: 'User',
createdAt: type : Date, default : Date.now
);
module.exports = mongoose.model( 'DoSchema', doSchema );
在user.js
文件中
var DoModel = require('./doSchema');// exact path
const userSchema = new mongoose.Schema(
email: type: String, unique: true ,
password: String,
todosDo: [DoModel.schema],
【讨论】:
@shishab 感谢您的回答,但是当我尝试运行它时,它只是不断加载并且不显示任何内容。但是,我知道该应用程序已到达 console.log,因为它打印出的 doTodos 仍然是一个空数组。 继续加载,因为它没有返回任何内容。更新的答案。确保您在todosDo
中的数据在 user
集合中。【参考方案2】:
感谢大家的帮助!我的问题是我需要将 post 路由中所有新创建的 todos 推送到 todosDo,这样我就可以在 get 路由中检索它们。现在一切正常!
【讨论】:
以上是关于在子文档 MongoDB 中检索数组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用python脚本从mongoDB中检索数组中的子文档