在集合返回后调用集合上的映射与使用点链接映射

Posted

技术标签:

【中文标题】在集合返回后调用集合上的映射与使用点链接映射【英文标题】:calling map on a collection after it has been returned vs chaining map using the dot 【发布时间】:2021-11-24 13:39:32 【问题描述】:

这按预期工作:

    let responses = await Response.find(
      responder_id: req.user._id,
    ).populate( path: "query_id", select: ["query_type", "content"] );

    responses = responses.map((response) => 
      return response.query_id;
    );

但以下没有:

    let responses = await Response.find(
      responder_id: req.user._id,
    )
      .populate( path: "query_id", select: ["query_type", "content"] )
      .map((response) => 
        return response.query_id;
      );

我唯一能想到的可能是它与这些函数的异步特性有关。

【问题讨论】:

使用 .populate().exec().map() 这应该会有所帮助 【参考方案1】:

优先级并不像你想象的那样。等待的不是Response.find(...),而是Response.find(...).populate(...)。考虑到这一点,下面是正确写成第二种形式的方法(唯一的区别是一对括号):

let responses = (await Response.find(
  responder_id: req.user._id,
)
  .populate( path: "query_id", select: ["query_type", "content"] ))
  .map((response) => 
    return response.query_id;
  );

但是,需要重新缩进以使其可读。无论如何,第一个 sn-p 可能更容易阅读。

【讨论】:

以上是关于在集合返回后调用集合上的映射与使用点链接映射的主要内容,如果未能解决你的问题,请参考以下文章

epoll集合中fd与关联状态的映射

Dapper 多重映射 - 集合为空

Java 集合快速失败异常

Map

调用返回多个集合时的 ​​NSFetchRequest

使用高阶函数的函数式编程对集合进行操作