【问题标题】:Querying Mongodb Subdocuments error Converting circular structure to JSON查询 Mongodb 子文档错误将循环结构转换为 JSON
【发布时间】:2015-04-02 12:17:48
【问题描述】:

我有一个包含子文档数组的文档:

{
  "company": "test plc",
  "address": [
    {
      "addr1": "37",
      "addr2": "",
      "addr3": "test",
      "addr4": "",
      "addrcity": "",
      "addrcounty": "test",
      "addrpostcode": "test"
    },
    {
      "addr1": "37",
      "addr2": "",
      "addr3": "test",
      "addr4": "",
      "addrcity": "",
      "addrcounty": "test",
      "addrpostcode": "test"
    },
    {
      "addr1": "37",
      "addr2": "",
      "addr3": "test",
      "addr4": "",
      "addrcity": "",
      "addrcounty": "test",
      "addrpostcode": "test"
    }
  ],
  "contacts": [
    {
      "name": "test",
      "surname": "testing",
      "title": "master"
    },
    {
      "name": "test",
      "surname": "testing",
      "title": "master"
    }
  ]
}

我想做的是通过搜索contacts.surname 属性返回一个文档列表。

var leads = Lead.find({"contact.surname":req.params.name});

这会导致错误“将循环结构转换为 JSON”,但我不知道为什么。

在编辑时添加:

这是我的集合架构:

var leadsSchema = new Schema({
  company: String,
  address:
  [
    {
      addr1: String,
      addr2: String,
      addr3: String,
      addr4: String,
      addrcity: String,
      addrcounty: String,
      addrpostcode: String
    }
  ],
  contacts:
  [
    {
      name: String,
      surname: String,
      title: String
    }
  ]
});
var Lead = mongoose.model('leads', leadsSchema);

这是我的两个路由器:

这会从集合中返回所有查找:

router.get('/', function(req, res) {
  Lead.find({}).exec(function(err, leads) {
    res.send(leads);
  });
});

这会导致循环错误:

router.get('/findByContactName/:surname', function(req, res) {
  var leads = Lead.find({"contacts.surname":req.params.name});
  res.send(leads);
});

【问题讨论】:

    标签: json node.js mongodb express


    【解决方案1】:

    试试这个

    router.get('/findByContactName/:surname', function(req, res){
    Lead.find({"contacts.surname":req.params.name}).exec(function(err, leads){
    res.send(leads);
    });
    

    【讨论】:

    • 啊好地方。我认为这是一个错字,但在添加这个问题时。更新为: var Leads = Lead.find({"contacts.surname":req.params.name}); res.send(潜在客户);但仍然是同样的错误
    • 查看这篇 SO 文章,尝试找出导致循环结构的字段。 (req.params.name 只是一个字符串值吗?)stackoverflow.com/questions/7005205/…
    • 是的。我什至尝试过 Lead.find({"contact.surname":"testing"});
    • 查询是否从 mongo shell 工作?如果是这样,那么您可以排除查询或数据库是问题所在。你能提供更多关于你正在进行的数据库调用的代码吗?
    • 感谢您的建议。是的,shell 返回了我期待的行。
    【解决方案2】:

    或者试试这个

     router.get('/findByContactName/:surname', async (req, res)=> {
          const leads = await Lead.find({"contacts.surname": req.params.surname });
          res.send(leads);
        });
    

    【讨论】:

      【解决方案3】:

      TL;DR:

      更改var leads = Lead.find({"contacts.surname":req.params.name});

      收件人:

      var leads = await Lead.find({"contacts.surname":req.params.name});

      说明

      model.find() 只返回一个查询。它不会为您执行查询。所以,'leads' 变量当前是一个 Mongoose 查询文档。

      当您执行 res.send(leads) 时,express 内部会这样做:

      JSON.stringify(leads)

      stringify() 无法将循环结构转换为 JSON。因此,错误。

      如果这里有人能解释为什么 Mongoose 查询文档是一个圆形结构,那就太好了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-31
        • 1970-01-01
        • 2017-03-23
        • 2017-07-27
        • 2015-07-26
        • 2018-05-05
        • 1970-01-01
        • 2018-09-17
        相关资源
        最近更新 更多