如何将ObjectId参数添加到mongodb查找

约翰·格雷森

我正在查找,其中本地字段是ObjectId,而外部字段是ObjectId的数组。执行查找给我错误:

arguments to $lookup must be strings

我已经做了类似的查找,其中外来字段不是数组(而是ObjectId),因此错误似乎是模棱两可的。我的数据库包含两个集合:歌曲和播放列表。一首歌曲可以属于许多播放列表。我正在尝试编写一个聚合,以返回匹配的歌曲,该歌曲包含该歌曲所属的播放列表数组:

歌曲:

[
  {
    songName: "In Da Club",
    _id: ObjectId(1)
  },
  {
    songName: "Happy Birthday",
    _id: ObjectId(2)
  },
  {
    songName: "Ode to Joy",
    _id: ObjectId(3)
  }
]

播放清单:


[
  {
    _id: ObjectId(4)
    playlistName: "PlaylistOne,
    songs: [ObjectId(1), ObjectId(3)]
  },
  {
    _id: ObjectId(5)
    playlistName: "PlaylistTwo,
    songs: [ObjectId(1)]
  }
]

期望的结果:


{
  songName: "In Da Club",
  _id: ObjectId(1),
  playlists: [
    {
      _id: ObjectId(4),
      playlistName: "PlaylistOne,
    },
    {
      _id: ObjectId(5),
      playlistName: "PlaylistTwo"
    }
  ]
}



我试过的查询:

db.songs.aggregate([
  {
    $match: {
      songName: "In Da Club"
    }
  },
  {
    $lookup: {
      from: 'playlists',
      let: { songId: '$_id'},
      pipeline: [
        {
          $match: {
            $expr: {
              {
                $in: ["$$songId", "$songs"]
              }
            }
          }
        }
      ],
      as: 'playlists'
    }
  }
])

这似乎是一个相对简单的查询,由于我的查询基于ObjectId,因此我不确定如何避免“传递给查询的参数必须是字符串”错误。任何帮助将不胜感激!TIA!

谁-假面真灵魂

虽然$ lookup是在版本中引入的,3.2但是在随后的更新中对其进行了一些增强:

根据文档:

从MongoDB 3.4开始,如果localField是一个数组,则可以将数组元素与标量foreignField进行匹配,而无需$ unwind阶段。

MongoDB 3.6增加了对在联接的集合上执行管道的支持,它允许指定多个联接条件以及不相关的子查询。

因此,问题可能出在mongodb版本较低。无论如何,您都可以使用$lookupon数组用于单等联接foreignField

{
    $lookup: {
      from: "playlists",
      localField: "_id", // Scalar value
      foreignField: "songs", // Against an array
      as: "playlists"
    }
  }

测试: mongoplayground

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将请求参数添加到XMLHttpRequest

来自分类Dev

如何将JVM参数添加到Tomcat?

来自分类Dev

如何将参数添加到GET ajax请求?

来自分类Dev

如何将构造函数参数添加到列表?

来自分类Dev

如何将请求参数添加到XMLHttpRequest

来自分类Dev

如何将参数添加到link.asmx

来自分类Dev

如何将参数添加到报告中

来自分类Dev

如何将带有objectId的二进制数据添加到mongoDB?

来自分类Dev

如何将带有objectId的二进制数据添加到mongoDB?

来自分类Dev

如何将参数添加到 form_for,但不想将它们添加到模型?

来自分类Dev

Django:如何将查找字段添加到ListView?

来自分类Dev

如何将查询参数添加到Play重定向?

来自分类Dev

我如何将参数添加到实体框架原始SQL命令

来自分类Dev

如何将URL参数从NameValuePair添加到HttpPost请求

来自分类Dev

如何将_locale参数添加到安全路径?

来自分类Dev

如何将SQL查询参数添加到服务报告中

来自分类Dev

如何将GET参数添加到django-tables2 LinkColumn

来自分类Dev

Wordpress:如何将url GET参数添加到主菜单项

来自分类Dev

WIX-如何将命令参数添加到文件

来自分类Dev

如何将Int值添加到Alamofire上传参数

来自分类Dev

如何将参数添加到URL并重新加载页面

来自分类Dev

SSIS:如何将变量参数添加到Lookup Transformation Editor?

来自分类Dev

如何将参数传递给添加到启动应用程序的脚本?

来自分类Dev

如何将多个编译器参数添加到meson.build

来自分类Dev

角度| 如何将参数添加到URL(some-url?param1 = foo)

来自分类Dev

如何将_locale参数添加到安全路径?

来自分类Dev

我如何将参数作为动态数组添加到php中的函数

来自分类Dev

如何将呼叫者IP添加到Webget UriTemplate参数

来自分类Dev

如何将“ atkbd.reset i8042.nomux”参数添加到rEFInd?

Related 相关文章

  1. 1

    如何将请求参数添加到XMLHttpRequest

  2. 2

    如何将JVM参数添加到Tomcat?

  3. 3

    如何将参数添加到GET ajax请求?

  4. 4

    如何将构造函数参数添加到列表?

  5. 5

    如何将请求参数添加到XMLHttpRequest

  6. 6

    如何将参数添加到link.asmx

  7. 7

    如何将参数添加到报告中

  8. 8

    如何将带有objectId的二进制数据添加到mongoDB?

  9. 9

    如何将带有objectId的二进制数据添加到mongoDB?

  10. 10

    如何将参数添加到 form_for,但不想将它们添加到模型?

  11. 11

    Django:如何将查找字段添加到ListView?

  12. 12

    如何将查询参数添加到Play重定向?

  13. 13

    我如何将参数添加到实体框架原始SQL命令

  14. 14

    如何将URL参数从NameValuePair添加到HttpPost请求

  15. 15

    如何将_locale参数添加到安全路径?

  16. 16

    如何将SQL查询参数添加到服务报告中

  17. 17

    如何将GET参数添加到django-tables2 LinkColumn

  18. 18

    Wordpress:如何将url GET参数添加到主菜单项

  19. 19

    WIX-如何将命令参数添加到文件

  20. 20

    如何将Int值添加到Alamofire上传参数

  21. 21

    如何将参数添加到URL并重新加载页面

  22. 22

    SSIS:如何将变量参数添加到Lookup Transformation Editor?

  23. 23

    如何将参数传递给添加到启动应用程序的脚本?

  24. 24

    如何将多个编译器参数添加到meson.build

  25. 25

    角度| 如何将参数添加到URL(some-url?param1 = foo)

  26. 26

    如何将_locale参数添加到安全路径?

  27. 27

    我如何将参数作为动态数组添加到php中的函数

  28. 28

    如何将呼叫者IP添加到Webget UriTemplate参数

  29. 29

    如何将“ atkbd.reset i8042.nomux”参数添加到rEFInd?

热门标签

归档