我想使用数组元素循环引用模式

问题描述 投票:0回答:1

我想循环遍历带有数组元素的引用模式,但打印了一些名为

*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 上查找,这要慢得多

node.js mongodb mongoose ejs
1个回答
0
投票

当您查询数据时,只需传入匹配要输出的数组元素的属性的条件即可。

例如,如果您只想

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'
   })
})
© www.soinside.com 2019 - 2024. All rights reserved.