【问题标题】:$lookup returning empty array$lookup 返回空数组
【发布时间】:2018-02-03 22:25:47
【问题描述】:

我有一个学生收藏和一个班级收藏 student._id(ObjectId) 需要在 classes.owner(String) 上查找文件集合时匹配。我得到文件的空数组。我做错了什么?

var express = require('express');
var router = express.Router();
var Account = require('../models/account');
var Connections = require('../models/connections');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;


//get all advocates for student.
router.route('/:student_id?')

  .get(function (req, res) {

    Account.aggregate(
      { "$match": { "_id": mongoose.Types.ObjectId(req.params.student_id) } },
      {$lookup:
        {
          from: 'classes',
          localField: 'owner',//**String**
          foreignField: '_id', //**ObjectId**
          as: 'classes'
        }
      }       
    ).exec(function (err, doc) {
        console.log(doc[0]);
        if (err) {
          res.send(err);
        } else {
          res.send(doc[0]).end();
        }
      })
  });


module.exports = router;

【问题讨论】:

  • 发布您的架构。而_id: req.params.student_id 就足够了。
  • 问题似乎在查找中。您不能将 ObjectId 的本地字段与 String 的 foreignField 匹配。无论如何围绕这个?
  • 是的.. 将类所有者更改为 ObjectId。为什么要使用字符串?
  • 我可以轻松做到这一点,但问题是为了使该 ID 在前端可用,我不是必须在整个地方解析它吗?就像每次我需要引用它时都将它转换为字符串一样?还是 mongoose 在将其发送回 UI 之前会自动将其作为字符串返回?
  • 哦,另一个问题是我将如何将所有者保存为对象 ID,而不是添加新条目?因为 UI 会将其作为 API 调用中的字符串传回。我是否需要将其声明为我的模型的对象 ID 或其他东西?

标签: javascript mongodb mongoose


【解决方案1】:

check you from 子句,是你的收藏名称吗?我使用了架构名称而不是集合名称,结果为空。

{$lookup:
        {
          from: 'classes',  //check this
          localField: 'owner',//**String**
          foreignField: '_id', //**ObjectId**
          as: 'classes'
        }
      }   

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 2019-04-15
    • 2021-11-16
    • 2017-11-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多