MongoDB展开聚合查询给出意想不到的结果

Posted

技术标签:

【中文标题】MongoDB展开聚合查询给出意想不到的结果【英文标题】:MongoDB unwind aggregation query giving unexpected results 【发布时间】:2019-07-02 12:45:14 【问题描述】:

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

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

【问题讨论】:

真的很奇怪,你确定你的聚合只返回一个值吗?我做了一个 Fiddle (mongoplayground.net/p/5hHOryuS7ZX) 来测试你的查询,它得到了不止一个用户,虽然我没有用更大的网络阵列进行测试 阳性。它只返回一个值。感谢您为小提琴所做的努力以及由此带来的确认措施,@MatheusHatje 因为你把$unwind 变成了network 数组 【参考方案1】:

哦,亲爱的。问题是网元格式不一致。在某些文档上,网络元素可以展开,因为它是一个数组:

"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:

【讨论】:

以上是关于MongoDB展开聚合查询给出意想不到的结果的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 查找和展开没有给出正确的结果

在 mongodb 聚合框架中展开字典值

MongoDB聚合查找和展开[重复]

详细教程一文参透MongoDB聚合查询

mongodb 分组聚合查询

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用