当外来字段是ID数组时的MongoDB查找

普拉卡什(Prakash Ranjan)

我有两个系列,水果和推销员。我希望我的查询返回所有以逗号分隔的业务员的水果。

推销员文档具有水果ID数组

水果文档具有ID,名称,........推销员表具有ID,名称,水果[apple_id,mango_id .......],...

db.getCollection('fruit').aggregate([{ "$unwind": "$fruits" }, { "$lookup": {
       "from": "salesman",
       "localField": "fruits",
       "foreignField": "_id",
       "as": "fruitObjects"
    }},
    { "$unwind": "$fruitObjects" } ])

甚至这个查询也没有给出$ fruitObjects ..的结果?

水果文件

{
    "_id" : ObjectId("5b101caddcab7850a4ba32eb"),
    "name" : "Mango"
}

{
    "_id" : ObjectId("5b101caddcab7850a4ba32ec"),
    "name" : "Pears"
}

{
   "_id" : ObjectId("5b101caddcab7850a4ba32de"),
    "name" : "apple"
}

{
   "_id" : ObjectId("5b101caddcab7850a4ba32fe"),
    "name" : "guava"
}

推销员文件

{
    "_id" : ObjectId("5b101caddcab7850a4ba3257"),
    "name" : "xyz",
    "fruits":["5b101caddcab7850a4ba32ec","5b101caddcab7850a4ba32de","5b101caddcab7850a4ba32fe"]
}

{
    "_id" : ObjectId("5b101caddcab7850a4ba3258"),
    "name" : "abc",
    "fruits":["5b101caddcab7850a4ba32eb","5b101caddcab7850a4ba32de"]
}

{
   "_id" : ObjectId("5b101caddcab7850a4ba3259"),
    "name" : "def",
    "fruits":["5b101caddcab7850a4ba32ec"]
}

{
   "_id" : ObjectId("5b101caddcab7850a4ba3260"),
    "name" : "zxc",
    "fruits":["5b101caddcab7850a4ba32ec","5b101caddcab7850a4ba32de","5b101caddcab7850a4ba32eb"]
}
``````````````````````````
谁-假面真灵魂

是的@barrypicker是正确的-字段类型不匹配,导致上为空salesman,请尝试存储相同类型的字段。同时,您实际上可以将一种转换为其他类型-每次查询时,也不需要这样做$unwind,请尝试以下查询:

查询1:

db.fruit.aggregate([
    {
        $lookup:
        {
            from: "salesman",
            let: { fruitName: { $toString: '$_id' } },
            pipeline: [
                {
                    $match:
                    {
                        $expr:
                            { $in: ["$$fruitName", "$fruits"] }
                    }
                }, { $project: { name: 1, _id: 0 } }
            ],
            as: "salesman"
        }
    }])

查询1的结果:

/* 1 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32eb"),
    "name" : "Mango",
    "salesman" : [ 
        {
            "name" : "abc"
        }, 
        {
            "name" : "zxc"
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32ec"),
    "name" : "Pears",
    "salesman" : [ 
        {
            "name" : "def"
        }, 
        {
            "name" : "zxc"
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32de"),
    "name" : "apple",
    "salesman" : [ 
        {
            "name" : "abc"
        }, 
        {
            "name" : "zxc"
        }
    ]
}

/* 4 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32fe"),
    "name" : "guava",
    "salesman" : []
}

或者,如果您希望这些名称位于数组中:

查询2:

db.fruit.aggregate([
    {
        $lookup:
        {
            from: "salesman",
            let: { fruitName: { $toString: '$_id' } },
            pipeline: [
                {
                    $match:
                    {
                        $expr:
                            { $in: ["$$fruitName", "$fruits"] }
                    }
                }, { $project: { name: 1, _id: 0 } }
            ],
            as: "salesmanList"
        }
    }, {
        $project: {
            name: 1, salesman: {
                $map:
                {
                    input: "$salesmanList",
                    as: "each",
                    in: '$$each.name'
                }
            }
        }
    }])

查询2的结果:

/* 1 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32eb"),
    "name" : "Mango",
    "salesman" : [ 
        "abc", 
        "zxc"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32ec"),
    "name" : "Pears",
    "salesman" : [ 
        "def", 
        "zxc"
    ]
}

/* 3 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32de"),
    "name" : "apple",
    "salesman" : [ 
        "abc", 
        "zxc"
    ]
}

/* 4 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32fe"),
    "name" : "guava",
    "salesman" : []
}

水果收集:

/* 1 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32eb"),
    "name" : "Mango"
}

/* 2 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32ec"),
    "name" : "Pears"
}

/* 3 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32de"),
    "name" : "apple"
}

/* 4 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba32fe"),
    "name" : "guava"
}

推销员集合:

/* 1 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba3258"),
    "name" : "abc",
    "fruits" : [ 
        "5b101caddcab7850a4ba32eb", 
        "5b101caddcab7850a4ba32de"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba3259"),
    "name" : "def",
    "fruits" : [ 
        "5b101caddcab7850a4ba32ec"
    ]
}

/* 3 */
{
    "_id" : ObjectId("5b101caddcab7850a4ba3260"),
    "name" : "zxc",
    "fruits" : [ 
        "5b101caddcab7850a4ba32ec", 
        "5b101caddcab7850a4ba32de", 
        "5b101caddcab7850a4ba32eb"
    ]
}

如果你想从整个对象salesman,那么你可以删除{ $project: { name: 1, _id: 0 } }$lookup

参考: $ lookup$ map

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当外部字段和本地字段是对象数组时的MongoDB查找

来自分类Dev

在MongoDB中查找其数组字段包含某些子集的文档

来自分类Dev

MongoDB查找匹配的文档并更新对象数组内的匹配字段

来自分类Dev

MongoDB-按ID或其他字段查找条目

来自分类Dev

在嵌套对象的数组字段中按ID查找子文档

来自分类Dev

使用MongoDB时获取组_id的数组

来自分类Dev

使用 Meteor 和 MongoDB 根据 ID 数组查找用户

来自分类Dev

comapare id 数组并通过查找 mongoDB 获取值

来自分类Dev

如何在MongoDb中查找与数组中的字段和子文档字段匹配的文档

来自分类Dev

MongoDB管道$ unset字段(如果id在数组中)

来自分类Dev

在upsert更新时,mongodb $ addToSet设置为非数组字段

来自分类Dev

查找文档时如何防止MongoDB返回对象ID?

来自分类Dev

查找文档时如何防止MongoDB返回对象ID?

来自分类Dev

MongoDB 查找内部数组

来自分类Dev

MongoDB使用_id查找

来自分类Dev

与外部字段匹配的mongodb查找

来自分类Dev

SQL Join 多个外来ID

来自分类Dev

MongoDB:根据字段数组中的特定值查找并修改结果

来自分类Dev

在MongoDB中查找与对象数组中的多个字段匹配的文档

来自分类Dev

MongoDB C#驱动程序按字段值在数组中查找项目

来自分类Dev

MongoDB按字段查找对象的数组(联接条件和不相关的子查询)

来自分类Dev

查找MongoDB中字段值不存在数组中的哪些元素

来自分类Dev

在一个字段中按数组查找mongodb中的文档?

来自分类Dev

Mongodb:查找具有包含多个相同的指定值的数组字段的文档

来自分类Dev

MongoDB:根据字段数组中的特定值查找然后修改结果

来自分类Dev

jQuery在字段集中查找ID

来自分类Dev

在对nodejs和mongodb的字段中使用参数时,查找查询结果为空

来自分类Dev

MongoDB在子数组中查找

来自分类Dev

MongoDB的查找不返回数组

Related 相关文章

  1. 1

    当外部字段和本地字段是对象数组时的MongoDB查找

  2. 2

    在MongoDB中查找其数组字段包含某些子集的文档

  3. 3

    MongoDB查找匹配的文档并更新对象数组内的匹配字段

  4. 4

    MongoDB-按ID或其他字段查找条目

  5. 5

    在嵌套对象的数组字段中按ID查找子文档

  6. 6

    使用MongoDB时获取组_id的数组

  7. 7

    使用 Meteor 和 MongoDB 根据 ID 数组查找用户

  8. 8

    comapare id 数组并通过查找 mongoDB 获取值

  9. 9

    如何在MongoDb中查找与数组中的字段和子文档字段匹配的文档

  10. 10

    MongoDB管道$ unset字段(如果id在数组中)

  11. 11

    在upsert更新时,mongodb $ addToSet设置为非数组字段

  12. 12

    查找文档时如何防止MongoDB返回对象ID?

  13. 13

    查找文档时如何防止MongoDB返回对象ID?

  14. 14

    MongoDB 查找内部数组

  15. 15

    MongoDB使用_id查找

  16. 16

    与外部字段匹配的mongodb查找

  17. 17

    SQL Join 多个外来ID

  18. 18

    MongoDB:根据字段数组中的特定值查找并修改结果

  19. 19

    在MongoDB中查找与对象数组中的多个字段匹配的文档

  20. 20

    MongoDB C#驱动程序按字段值在数组中查找项目

  21. 21

    MongoDB按字段查找对象的数组(联接条件和不相关的子查询)

  22. 22

    查找MongoDB中字段值不存在数组中的哪些元素

  23. 23

    在一个字段中按数组查找mongodb中的文档?

  24. 24

    Mongodb:查找具有包含多个相同的指定值的数组字段的文档

  25. 25

    MongoDB:根据字段数组中的特定值查找然后修改结果

  26. 26

    jQuery在字段集中查找ID

  27. 27

    在对nodejs和mongodb的字段中使用参数时,查找查询结果为空

  28. 28

    MongoDB在子数组中查找

  29. 29

    MongoDB的查找不返回数组

热门标签

归档