【问题标题】:mongoose find by nested object ids return the entire document [duplicate]通过嵌套对象ID查找的猫鼬返回整个文档[重复]
【发布时间】:2017-10-05 13:35:00
【问题描述】:

这是我的文档结构:

{
"_id": "590dc8b17e52f139648b9b94",
"parent": [
    {
        "_id": "590dc8b17e52f139648b9b95",
        "child": [
            {
                "_id": "590dc8b17e52f139648b9b8f"
            },
            {
                "_id": "590dc8b17e52f139648b9b90"
            }
        ]
    },
    {
        "_id": "590dc8c57e52f139648b9b9b",
        "child": [
            {
                "_id": "590dc8c57e52f139648b9b96"
            }
        ]
    }
]}

我正在尝试仅返回有关我正在寻找的嵌套对象及其 _id 的信息。

router.get('/child/:id', (req, res) => {
    Project.findOne({ 'parent.child._id': req.params.id },
            (err, results) => {
                    if (err)
                            res.status(500).send(err);
      res.status(200).json(results.parent[0].child.id(req.params.id));

            }
    )});

问题在于 results 包含可能包含多个 parent 实例的整个文档 所以很明显,我的代码只有在已知的 child _id 位于第一个父级时才有效。

我该如何解决? 非常感谢

显然,展开和匹配解决方案很好,但对于 mongoose,您需要明确说明 id 是 ObjectId 类型。

 {$match:
{ "parent.child._id": new mongoose.Types.ObjectId(id) }
            }

found it here

【问题讨论】:

标签: node.js mongodb express mongoose


【解决方案1】:

基本上你可以 $unwind 先在聚合中的父级,然后匹配子级ID。这将确保它只为您提供父对象而不是整个文档。此外,如果匹配的 id 不需要在第一个父对象内,但它可以在父对象数组内的任何位置。它将从父数组返回 require 对象,该对象在其子数组中包含搜索 id。

db.project.aggregate([ 
    { $unwind : '$parent'},
    { $match : 
        { "parent.child._id" : '590dc8b17e52f139648b9b8f' } 
    } 
]);

蒙古语语法:

//mongoose

let Project = mongoose.model('project', yourProjectSchema);

Project.aggregate([ 
    { "$unwind" : '$parent'},
    { "$match" : 
        { "parent.child._id" : req.params.id } 
    } 
]);

【讨论】:

  • 谢谢,我仍在试图理解为什么我收到一个空数组作为结果
  • 在我上面提到的聚合解决方法之后,您是否收到一个空数组?还要确保将我提到的静态 id 替换为您的需求参数
  • 是的,我尝试使用现有的硬编码 id 和实际的请求参数。我还必须将 db.project.aggregate 更改为 Project.aggregate,因为我正在使用 mongoose
  • 您可以通过尝试上述查询和您的 child._id 值中存在的硬编码 id 来检查 mongo shell 吗?我也在答案中添加了猫鼬语法。
  • 谢谢,我通过添加解决了这个问题:new mongoose.Types.ObjectId(id)
猜你喜欢
  • 2019-10-12
  • 2023-01-30
  • 2015-01-06
  • 2023-01-31
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
相关资源
最近更新 更多