【问题标题】:lookup on ObjectId's in an array在数组中查找 ObjectId
【发布时间】:2019-05-07 06:57:31
【问题描述】:

我有商店集合和用户集合,其中包含商店 ID 列表作为字符串。

店铺文件示例:

    {
            "_id" : ObjectId("5a0c6797fd3eb67969316ce2"),
            "picture" : "http://placehold.it/150x150",
            "name" : "Genmom",
            "email" : "leilaware@genmom.com",
            "city" : "Rabat",
            "location" : {
                    "type" : "Point",
                    "coordinates" : [
                            -6.79387,
                            33.83957
                    ]
            }
    }

用户集合示例:

{
            "_id" : ObjectId("5c04b943ff491824b806686a"),
            "email" : "ayoub.khial@gmail.com",
            "password" : "$2a$10$4Wt5Rn6udxREdXCIt3hGb.sKhKUKOlyiYKmLTjYG3SqEPKFSw9phq",
            "likedShops" : [
                    "5a0c6797fd3eb67969316ce2",
                    "5c07ada8ff49183284e509d1",
                    "5c07acc1ff49183284e509d0"
            ],
            "dislikedShops" : [ ]
}

我想返回likeShops的详细信息。

【问题讨论】:

  • likedShops ids 的类型是什么?字符串还是 OBjectID?您使用的是什么版本的 mongo?
  • @AnthonyWinzlet 字符串
  • 还有mongodb版本?
  • mongodb 4.2版

标签: database mongodb mongodb-query aggregation-framework


【解决方案1】:

你可以在下面使用$lookup聚合

db.users.aggregate([
  { "$lookup": {
    "from": "shops",
    "let": { "likedShops": "$likedShops" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$_id", "$$likedShops"] }}}
    ],
    "as": "likedShops"
  }}
])

或者,如果您的 id 是字符串,则使用 $toString 聚合和 ObjectIds

db.users.aggregate([
  { "$lookup": {
    "from": "shops",
    "let": { "likedShops": "$likedShops" },
    "pipeline": [
      { "$match": { "$expr": { "$in": [{ "$toString": "$_id" }, "$$likedShops"] }}}
    ],
    "as": "likedShops"
  }}
])

【讨论】:

  • 我收到"errmsg" : "$in requires an array as a second argument, found: missing"
  • 顺便说一句,我有一些用户没有 likeShops 字段:)
  • 您的部分文档不包含likedShop 字段。见this
猜你喜欢
  • 2016-04-30
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多