查询Mongodb子文档错误将循环结构转换为JSON

Dom*_*lan 1 json mongodb node.js express

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

{
  "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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

var leads = Lead.find({"contact.surname":req.params.name});
Run Code Online (Sandbox Code Playgroud)

这会导致错误“将圆形结构转换为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);
Run Code Online (Sandbox Code Playgroud)

这是我的两个路由器:

这将从集合查找中返回所有内容:

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

这会导致循环错误:

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

Ame*_*mey 10

特尔;博士:

改变 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 查询文档是圆形结构,那就太好了!


Kev*_*ady 6

尝试这个

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


Cha*_*wki 5

或者试试这个

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