【问题标题】:How to join in mongo query with Array of IDs?如何使用 ID 数组加入 mongo 查询?
【发布时间】:2020-06-09 19:42:06
【问题描述】:

下面是我的 TEST 表对象,其中包含类别 id 数组

{
    "_id" : ObjectId("5ede075651957a5d540c7828"),
    "Tags" : [ 
        "demo", 
        "skype"
    ],
    "CategoryID" : [ 
        "5edb65a834c5cc735a76b8e4", 
        "5edb65ae34c5cc735a76b8e5"
    ],
    "Title" : "demo 1",
    "Description" : "<p>sdfsdf</p>",
    "MetaTitle" : "asd",
    "MetaDescription" : "asdas",
    "MetaKeywords" : "asd",
    "CanonicalUrl" : "asd",
    "Index" : "No Index",
    "ImagePath" : "",
    "Position" : 0,
    "AuthorID" : ObjectId("5ecbae9f1bfe823e940e12a0"),
    "AuthorName" : "Admin",
    "SearchTerm" : "",
    "isPublish" : "0",
    "isDeleted" : false,
    "AddedOn" : ISODate("2020-06-08T09:39:34.007Z"),
    "LastModifiedOn" : ISODate("2020-06-08T09:39:34.007Z"),
    "__v" : 0
}

下面是我要从中获取类别名称的类别表

{
    "_id" : ObjectId("5edb65a834c5cc735a76b8e4"),
    "Name" : "Cat 1",
    "ParentID" : "0",
    "IsDeleted" : false,
    "AddedOn" : ISODate("2020-06-06T09:45:12.632Z"),
    "LastModifiedOn" : ISODate("2020-06-06T09:45:12.632Z"),
    "__v" : 0
}

所以,我想从“TEST”表中获取记录,也想加入“Category”表以获取逗号分隔的Category name,它们是数组格式的“TEST”表.

我尝试了下面的查询,但它只适用于单个 记录在“CategoryID”数组中。如果我在 categoryID 数组中发送多条记录,那么它会多次给出不同类别的相同记录。

const getData = await TESTModel.aggregate([
    {
        $lookup: {
            from: "Category",       // other table name (Admin Table)
            localField: "CategoryID",   // name of blog table field
            foreignField: "_id", // name of Admin table field
            as: "testdata"         // alias for userinfo table
        },
    },
    {
        $unwind: "$testdata",
        $unwind: {
            path: "$testdata",
            preserveNullAndEmptyArrays: true
        }
    },
])

那么,如何在查询结果中获取逗号分隔的类别名称。

【问题讨论】:

  • categoryTEST 集合中您尝试“加入”的字段必须是相同的数据类型(其中一个是ObjectId,另一个是数组中的字符串) .它们必须是同一类型。您可以使用聚合运算符$convert 将ObjectId 转换为String,然后进行比较。 $lookup 有一个 variation,您可以在其中指定一个 管道 进行匹配(带转换)。
  • 谢谢,你能给我举个例子吗?
  • 您可能想尝试说明您面临的问题。查找的管道允许使用 $match 阶段,您可以在其中将字符串数组与 ObjectId 的字符串版本进行比较。提供的链接中有示例。看到这个帖子:Mongodb Join on _id field from String to ObjectId.

标签: mongodb mongoose mongodb-query


【解决方案1】:

试试下面的代码。

const data = TESTModel.aggregate([
       {
           $lookup:{
             from: "blogCategory",
             localField: "CategoryID",
             foreignField: "_id",
             as: "enrollee_info"
          }
       }
])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多