Mongodb $ lookup连接所有集合而不是匹配对象

时间:2018-06-18 14:10:39

标签: mongodb lookup

所以我试图用Mongodb进行$ lookup查找,但我有一个奇怪的输出。 我有两个系列,#34;网站"和"消费"。

网站:

{
    "_id" : ObjectId("5b26db6e7f59e825909da106"),
    "siteId" : 49,
    "industry" : "Commercial Property",
    "sub_industry" : "Shopping Center/Shopping Mall",
    "square_feet" : 497092,
    "latitude" : 41.2161756,
    "longitude" : -78.14809154,
    "timezone" : "America/New_York",
    "timezone_offset" : "-04:00",
    "__v" : 0
}

消费:

{
    "_id" : ObjectId("5b26db907f59e825909f3d2a"),
    "timestamp" : 1325382000,
    "dttm_utc" : ISODate("2012-01-01T00:40:00Z"),
    "value" : 2.8956,
    "estimated" : 0,
    "anomaly" : "",
    "site" : [
            {
               "_id" : ObjectId("5b26db727f59e825909da16a")
            }
    ],
    "__v" : 0
}

这是我想要的$ lookup:

db.consumptions.aggregate([
  {
   $lookup:
     {
       from: "sites",
       localField: "site.id",
       foreignField: "id",
       as: "site"
     }
  }
])

预期的输出是在每次消费中获得网站的详细信息:

{
    "_id" : ObjectId("5b26db907f59e825909f3d2a"),
    "timestamp" : 1325382000,
    "dttm_utc" : ISODate("2012-01-01T00:40:00Z"),
    "value" : 2.8956,
    "estimated" : 0,
    "anomaly" : "",
    "site" : [
        {
            "_id" : ObjectId("5b26db6e7f59e825909da106"),
            "siteId" : 49,
            "industry" : "Commercial Property",
            "sub_industry" : "Shopping Center/Shopping Mall",
            "square_feet" : 497092,
            "latitude" : 41.2161756,
            "longitude" : -78.14809154,
            "timezone" : "America/New_York",
            "timezone_offset" : "-04:00",
            "__v" : 0
        }
    ],
    "__v" : 0
}

这是我使用$ lookup输出的输出:

{
    "_id" : ObjectId("5b26db907f59e825909f3d2a"),
    "timestamp" : 1325382000,
    "dttm_utc" : ISODate("2012-01-01T00:40:00Z"),
    "value" : 2.8956,
    "estimated" : 0,
    "anomaly" : "",
    "site" : [
            {
                    "_id" : ObjectId("5b26db6e7f59e825909da0f3"),
                    "siteId" : 6,
                    "industry" : "Commercial Property",
                    "sub_industry" : "Shopping Center/Shopping Mall",
                    "square_feet" : 161532,
                    "latitude" : 34.78300117,
                    "longitude" : -106.8952497,
                    "timezone" : "America/Denver",
                    "timezone_offset" : "-06:00",
                    "__v" : 0
            },
            {
                    "_id" : ObjectId("5b26db6e7f59e825909da0f4"),
                    "siteId" : 8,
                    "industry" : "Commercial Property",
                    "sub_industry" : "Shopping Center/Shopping Mall",
                    "square_feet" : 823966,
                    "latitude" : 40.32024733,
                    "longitude" : -76.40494239,
                    "timezone" : "America/New_York",
                    "timezone_offset" : "-04:00",
                    "__v" : 0
            }, ... (all the sites details are listed)
      ],
      "__v" : 0
}

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您需要先$unwind site数组将site._id与外国字段_id匹配,然后再$group再次回滚到数组中。

db.collection.aggregate([
  { "$unwind": "$site" },
  { "$lookup": {
    "from": Site.collection.name,
    "localField": "site._id",
    "foreignField": "_id",
    "as": "site"
  }},
  { "$unwind": "$site" },
  { "$group": {
    "_id": "$_id",
    "value": { "$first": "$value" },
    "estimated": { "$first": "$estimated" },
    "anomaly": { "$first": "$anomaly" },
    "timestamp": { "$first": "$timestamp" },
    "dttm_utc": { "$first": "$dttm_utc" },
    "site": { "$push": "$site" }
  }}
])

如果您有mongodb 3.6,那么您可以试试这个

db.collection.aggregate([
  { "$unwind": "$site" },
  { "$lookup": {
    "from": Site.collection.name,
    "let": { "siteId": "$site._id" },
    "pipeline": [
       { "$match": { "$expr": { "$eq": [ "$_id", "$$siteId" ] } } }
     ],
     "as": "site"
  }},
  { "$unwind": "$site" },
  { "$group": {
    "_id": "$_id",
    "value": { "$first": "$value" },
    "estimated": { "$first": "$estimated" },
    "anomaly": { "$first": "$anomaly" },
    "timestamp": { "$first": "$timestamp" },
    "dttm_utc": { "$first": "$dttm_utc" },
    "site": { "$push": "$site" }
  }}
])

确保您应正确放置Site.collection.name

答案 1 :(得分:0)

我认为$ lookup不能直接使用数组。

首先尝试使用$ unwind。