MongoDB展开聚合查询可产生意外结果

时间:2019-07-02 12:45:14

标签: mongodb aggregation-framework

要查看用户集合中的哪些文档具有指向特定用户的链接,我使用以下聚合查询:

db.getCollection("users").aggregate([
{
    $match: {
        $or: [
            {_id: ObjectId("5b63133c45a56952c9430776")},
            {_id: ObjectId("5b69caec45a56952c8010bdb")},
            {_id: ObjectId("5bb49ece45a5696eb624c4f4")}
        ]    
    }
},

{
    $unwind: {path: "$network"}
},

{
    $project: {_id:1,network:1}
},

{
    $match: 
        {"network.id": "5c958c7745a5691cff06f252"}
}

])

给出以下结果,表明三个用户中只有一个匹配:

/* 1 */
{
    "_id" : ObjectId("5b69caec45a56952c8010bdb"),
    "network" : {
        "id" : "5c958c7745a5691cff06f252",
        "status" : "connected",
        "updated_at" : ISODate("2019-06-27T00:58:45.501Z")
    }
}

但是,如果我分别查询三个用户,例如第一个用户:

db.getCollection("users").find({_id:ObjectId("5b63133c45a56952c9430776")}, {network:1});

发现一个网络项未显示在聚合查询中(请参阅项113):

/* 1 */
{
    "_id" : ObjectId("5b63133c45a56952c9430776"),
    "network" : {
        "0" : {
            "id" : "5b61b7c845a56960683cc53c",
            "status" : "connected",
            "updated_at" : ISODate("2019-06-26T03:48:38.293Z")
        },
        "1" : {
            "id" : "5bc7ee7745a56931124e50de",
            "status" : "sent"
        },

        ...

        "113" : {
            "id" : "5c958c7745a5691cff06f252",
            "status" : "connected",
            "updated_at" : ISODate("2019-06-28T07:19:34.463Z")
        },

        ...

    }
}

我的聚合查询是否错误,或者这是聚合框架中的错误?

MongoDB版本3.6.6

1 个答案:

答案 0 :(得分:0)

哦,亲爱的。问题在于网元格式不一致。在某些文档中,网络元素可能是未缠绕的,因为它是一个数组:

"network": [
      {
        "id": "5c958c7745a5691cff06f252",
        "status": "connected"
      },
      {
        "id": "5bc7ee7745a56931124e50de",
        "status": "sent"
      }
    ]

在其他情况下,$ unwind指令什么也不做,因为格式是键对象:

"network" : {
        "0" : {
            "id" : "5b61b7c845a56960683cc53c",
            "status" : "connected",
            "updated_at" : ISODate("2019-06-26T03:48:38.293Z")
        },
        "1" : {
            "id" : "5bc7ee7745a56931124e50de",
            "status" : "sent"
        }
     }

因此,在整个集合中正常发送格式后,一切都按预期工作。 :facepalm:

相关问题