Mongo查询过滤器$ lookup无法正确过滤

时间:2019-09-27 13:46:51

标签: mongodb mongodb-query

我有3个查询,就我的知识而言,它们应该是同义词,但是它们给出的结果却截然不同,而且我想知道是否有人可以帮助填补我的知识空白。

这是一个完美的作品,它给出了我想要的确切结果,创建它的用户

db.getCollection("core-navlink").aggregate([
    { $match : { id : "c1a13efc-1203-436b-a32c-e59a889c08a3" } },
    {
        $lookup : {
            from : "core-user",
            as : "created_by_user",
            let : { module_id : "$created_by.module_id" },
            pipeline : [
                { $match : {  $expr : { $and : [ {  $eq : [ "$id" ,  "$$module_id"] }  ] } } } 
            ]
        } 
    } 
]).projection({})
   .sort({_id:-1})
   .limit(100)

这个“ created_by_user”不仅为所有用户提供我要寻找的用户,而且

db.getCollection("core-navlink").aggregate([
    { $match : { id : "c1a13efc-1203-436b-a32c-e59a889c08a3" } },
    {
        $lookup : {
            from : "core-user",
            as : "created_by_user",
            let : { module_id : "$created_by.module_id" },
            pipeline : [
                { $match : {  $expr : { $and : [ {  id :  "$$module_id"  } ] } } } 
            ]
        } 
    } 
]).projection({})
   .sort({_id:-1})
   .limit(100)

并且此结果在created_by_user数组中没有返回结果

db.getCollection("core-navlink").aggregate([
    { $match : { id : "c1a13efc-1203-436b-a32c-e59a889c08a3" } },
    {
        $lookup : {
            from : "core-user",
            as : "created_by_user",
            let : { module_id : "$created_by.module_id" },
            pipeline : [
                { $match : {     id :  "$$module_id"  }  } 
            ]
        } 
    } 
]).projection({})
   .sort({_id:-1})
   .limit(100)

UPDATE:示例文档 core-navlink :(最小化为仅相关字段)

{
  "_id": "c1a13efc-1203-436b-a32c-e59a889c08a3",
  "id": "c1a13efc-1203-436b-a32c-e59a889c08a3",
  "created_by": {
    "module_name": "USER",
    "module_id": "f0ae108f-7dca-4bd1-ba7a-bcf50d9f7814"
  }
}

核心用户

{
  "_id": "f0ae108f-7dca-4bd1-ba7a-bcf50d9f7814",
  "id": "f0ae108f-7dca-4bd1-ba7a-bcf50d9f7814",
  "first_name": "Joe",
  "last_name": "User",
}

1 个答案:

答案 0 :(得分:0)

查找不适用于管道属性。 如果假设字段名称错误,请更正我。 尝试如下操作:

db.getCollection("core-navlink").aggregate([
    { $match : { id : "c1a13efc-1203-436b-a32c-e59a889c08a3" } },
    {
        $lookup : {
            from : "core-user",
            localField: "module_id", // assumes this field on core-navlink
            foreignField: "_id", // assumes this field on "core-user"
            as : "created_by_user"

        } 
    } 
]);