我想循环遍历带有数组元素的引用模式,但打印了一些名为
*ref
的内容,如果是的话,这是什么?它意味着什么吗?
<ref *1> [
EmbeddedDocument {
__parentArray: [Circular *1],
__index: 0,
'$__parent': model { '$__': [InternalCache], '$isNew': false, _doc: [Object] },
'$__': InternalCache { activePaths: [StateMachine] },
_doc: {
label: 'Link',
link: 'https://www.link.com/sr?rb=1617',
links: [Array],
_id: [ObjectId]
},
'$isNew': false,
[Symbol(mongoose#documentArrayParent)]: model { '$__': [InternalCache], '$isNew': false, _doc: [Object] }
}
]
[
{
label: 'Link',
link: 'https://www.mylink.com/sr?rb=1617',
links: [
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object], [Object], [Object],
[Object], [Object], [Object], [Object],
... 2752 more items
],
_id: new ObjectId('65c92d92d0a329e4c356d99c')
}
]
我的目的是只打印下面的数组,是的,它添加了一些内容
<ref *1> EmbeddedDocument
文档的名称假设是
user.correspondingLinks
,
所以我必须将
user.correspondingLinks[0]
与索引 0
放在一起,但是如果我将 <*ref>
与 ejs 一起传递到 html 页面,我将不再获得引用,这只打印在主模块上,我认为....
那么如何在打印时摆脱这个
<*ref>
编辑
// USER SCHEMA MODEL FOR MONGODB //
const categoryLinkSchema = new mongoose.Schema({
label: String,
link: String,
links: { type: Array, default: [] }
});
const userSchema = new Schema({
username: {
type: String,
unique: true
},
password: String,
email: {
type: String,
unique: true
},
categoryLinks: {
type: [categoryLinkSchema],
validate: [function(doc) {
for(let d of doc){
const duplicates = this.categoryLinks.filter(function(c){
return c.link === d.link || c.label === d.label;
})
if(duplicates.length > 1){
return false;
}
}
}, 'Each categoryLinks.label must be unique.']
},
links : { type : Array , "default" : [] },
imagelink: String,
plan: String,
bakiye: Number,
phoneNumber: Number
});
我用这个
app.post
来处理我的请求
app.get('/cats/:kategorilabel', function(req, res) {
if(!req.session.username) { return res.redirect('/login') };
userModel.findOne({
username: req.session.username
}).then(
(user) => {
console.dir(user.categoryLinks) // this is where I get the log with *ref,
//locals.labelLinks.find(element => element.label == locals.katlabel) this is the find i do with ejs on browser, yet it is slower due to data transfer
res.render('labelkategori', {labelLinks: user.categoryLinks, katlabel: req.params['kategorilabel']});
}
).catch(
(error) => {
console.log('Error: ' + error.code + " error: " + error);
}
);
})
所以
user.categoryLinks
是一个大对象,我只想找到相应的标签并发送响应,否则会变慢。而且 *ref
搞乱了结构,所以我必须将整个对象发送到客户端浏览器并在 html 上查找,这要慢得多
当您查询数据时,只需传入匹配要输出的数组元素的属性的条件即可。
例如,如果您只想
categoryLinks.label
等于 bim-bebek
,您可以将其添加到查询对象中。当 mongoose 进行匹配时,您可以告诉它仅使用投影对象中的 categoryLinks
位置运算符输出 $
数组元素。但是,如果需要的话,您还必须指定要输出的所有其他字段,如下所示:
userModel.findOne(
{
username: req.session.username,
"categoryLinks.label": "bim-bebek"
},
{
"categoryLinks.$": 1
// username: 1, //< Include other fields in your projection if you need them
// email: 1,
}
).then(user => {
res.render('labelkategori', {
labelLinks: user.categoryLinks,
katlabel: req.params['kategorilabel']
});
}).catch(error =>{
console.log('Error: ' + error.code + " error: " + error);
res.status(500).json({
message: 'Error on server'
})
})