gpt4 book ai didi

MongoDB, Mongoose : How to find subdocument in found document?

转载 作者:IT老高 更新时间:2023-10-28 13:07:20 27 4
gpt4 key购买 nike

我一直在尝试通过 _id 在找到的文档中获取子文档。

示例架构

var User = mongoose.Schema({
name: String,
photos: [{src: String, title: String}]
});
var Team = db.model('Team', Team);

现在我得到了一个用户:

myUser = User.findOne(...)...

我现在如何通过 _id(或 title)获取他照片的 src

类似:

myUser.photos.findOne({'_id': myId})

最佳答案

您需要为嵌入的文档创建一个 NEW Schema,或者将类型声明保留为空白数组,以便 mongoose 解释为 Mixed 类型。

var userSchema = new mongoose.Schema({
name: String,
photos: []
});
var User = mongoose.model('User', userSchema);

-- 或--

var userSchema = new mongoose.Schema({
name: String,
photos: [photoSchema]
});

var photoSchema = new mongoose.Schema({
src: String,
title: String
});

var User = mongoose.model('User', userSchema);

然后你就可以这样保存了:

var user = new User({
name: 'Bob',
photos: [ { src: '/path/to/photo.png' }, { src: '/path/to/other/photo.png' } ]
});

user.save();

从这里,您可以简单地使用数组原语来查找您的嵌入式文档:

User.findOne({name: 'Bob'}, function (err, user) {

var photo = user.photos.filter(function (photo) {
return photo.title === 'My awesome photo';
}).pop();

console.log(photo); //logs { src: '/path/to/photo.png', title: 'My awesome photo' }
});

-- 或--

您可以使用嵌入式文档中特殊的 id() 方法按 id 查找:

User.findOne({name: 'Bob'}, function (err, user) {
user.photos.id(photo._id);
});

您可以在此处阅读更多信息:http://mongoosejs.com/docs/subdocs.html

确保不要向 mongoose 注册架构,否则它将创建一个新集合。还要记住,如果经常搜索子文档,最好使用下面的 refs 和 population。即使它两次命中数据库,由于索引,它的速度要快得多。此外,mongoose 会在双嵌套文档上运行(即 child 也有子文档)

var user = mongoose.Schema({
name: String,
photos: [{ type: Schema.Types.ObjectId, ref: 'Photo' }]
});

var photo = mongoose.Schema({
src: String,
title: String
});

User
.findOne({ name: 'foo' })
.populate('photos')
.exec(function (err, user) {
console.log(user.photos[0].src);
});

相关文档可以在这里找到 http://mongoosejs.com/docs/populate.html

关于MongoDB, Mongoose : How to find subdocument in found document?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21142524/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com