mongoose:如何遍历包含对象引用 (_id) 的数组

Posted

技术标签:

【中文标题】mongoose:如何遍历包含对象引用 (_id) 的数组【英文标题】:mongoose: how to loop through an array containing object references (_id) 【发布时间】:2015-12-27 01:49:42 【问题描述】:

我有一个 meanjs 项目,我从服务器上的用户那里得到一些输入,请求正文具有以下结构:


   transaction:  
       heading: '',
       items: [Object]    
   ,
   something: ,
   somethingAgain: 

items数组的结构如下——

[  ref: '5607c6536e67edb44a6a8186',
    name: '',
    quantity: 0,
    discount: 0,
    cost: 180  ]

其中ref 是我的项目模型中项目的_id 值。 所以,基本上我想要做的是遍历项目数组并填充每个 ref 的属性,并为每个项目相应地计算 cost 属性。 我不能使用简单的 for 循环,因为它甚至会在第一次异步调用 mongodb 以查找项目完成之前自行执行。 那么,如何解决这个问题?请建议。

所以,在问题中添加更多信息 - 我接收请求的服务器端控制器代码如下 -

exports.create = function (req, res) 
    console.log(req.body.transaction.items);
    Sale.create(req.body, function (err, sale) 
        if (err) 
            return handleError(res, err);
        
        return res.json(201, sale);
    );
;

项目的日志输出如我上面所示。所以我在这里要做的是遍历 items 数组并找到 ref 与 Items 集合匹配的项目。

【问题讨论】:

你看过猫鼬的人口特征吗? mongoosejs.com/docs/populate.html 您能否提供更多信息,也许是代码示例,说明您在服务器上究竟在做什么? 好的,请稍等。我将编辑帖子。 @JohnnyHK 我想填充,但我只需要整个 Items 集合中的一组受限记录。所以,如果我要填充,我会找到所有记录,然后填充它们,或者有什么方法可以在 mongoose find 方法中传递一个查询,以仅选择那些“_id”值我存储在items数组中的'ref'属性 我已经编辑了帖子。 @abiwer 也许我遗漏了一些东西,但为什么你不能在 mongo 调用之前迭代这些项目? 【参考方案1】:

如果我理解正确,我建议为此使用Kris Kowal's q。它是一个可以与 node 一起使用的小型 promise 库。 Angular 的 $q 就是基于它。这是一个例子:

function(req, res)

    var calls = [];

    calls.push(Collection1.save());

    calls.push(Collection2.save());

    calls.push(Collection3.save());

    q.all(calls).then(function(call1res, call2res, call3res)
        res.json(whaterver:'');
    );

【讨论】:

以上是关于mongoose:如何遍历包含对象引用 (_id) 的数组的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 为所有嵌套对象添加 _id

Mongoose JS - 填充方法不返回完整引用的对象... - 仅返回 objectId 版本

如何在nestjs mongoose typescript中引用嵌套文档

如何在 mongodb 中自动删除对象 ID 引用

如何填充递归模式引用 Mongodb、Mongoose、Express?

如何在没有 _id 参考的情况下获取 GraphqQL 列表中模型的填充值?