代码之家  ›  专栏  ›  技术社区  ›  Ian

Mongo对数组字段的排序不正确?

  •  1
  • Ian  · 技术社区  · 7 年前

    我正在尝试筛选一个数组字段,但不幸的是,该字段似乎无法正常工作。我读到的每一件事都表明这是可行的 某物 ,只是不符合我的预期,我无法解释。

    我要实现的是在数组子字段上排序。我已经用位置操作符实现了大部分功能,但是我不知道排序在做什么。

    db.getCollection('boards')
      .find({ "lastVisited.user": "AAA" }, { name: 1, "lastVisited.$" : 1 })
      .sort({ "lastVisited.0.timestamp": 1 });
    

    这将产生以下输出

    /* 1 */
    {
        "_id" : ObjectId("5b642d2cac2f544b1d48d09a"),
        "lastVisited" : [ 
            {
                "user" : "AAA",
                "timestamp" : ISODate("2018-08-18T00:00:00.000Z")
            }
        ]
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5b6845245e102f3844d2181b"),
        "lastVisited" : [ 
            {
                "user" : "AAA",
                "timestamp" : ISODate("2018-08-16T00:00:00.000Z")
            }
        ]
    }
    
    /* 3 */
    {
        "_id" : ObjectId("5b6842095e102f3844d2181a"),
        "lastVisited" : [ 
            {
                "user" : "AAA",
                "timestamp" : ISODate("2018-08-19T00:00:00.000Z")
            }
        ]
    }
    

    这里要注意的是日期是有顺序的 18th 然后 19th 然后 16th 这没道理!有人能解释一下吗?

    这些是我用过的文件:

    /* 1 */
    {
        "_id" : ObjectId("5b642d2cac2f544b1d48d09a"),
        "lastVisited" : [ 
            {
                "user" : "BBB",
                "timestamp" : ISODate("2018-08-04T00:00:00.000Z")
            }, 
            {
                "user" : "AAA",
                "timestamp" : ISODate("2018-08-18T00:00:00.000Z")
            }
        ]
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5b6842095e102f3844d2181a"),
        "lastVisited" : [ 
            {
                "user" : "AAA",
                "timestamp" : ISODate("2018-08-19T00:00:00.000Z")
            }
        ]
    }
    
    /* 3 */
    {
        "_id" : ObjectId("5b6845245e102f3844d2181b"),
        "lastVisited" : [ 
            {
                "user" : "AAA",
                "timestamp" : ISODate("2018-08-16T00:00:00.000Z")
            }
        ]
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Ian    7 年前

    不幸的是,您目前无法在Mongo中执行此操作,因为它仍然使用完整的文档(而不仅仅是投影部分)进行排序。所以您需要使用聚合框架。看到一个悬而未决的问题 https://jira.mongodb.org/browse/SERVER-4451

    下面是一个聚合示例,因为您希望排序发生在匹配的元素上

    db.getCollection('stack1').aggregate([
    // Initial document match (uses index, if a suitable one is available)
    { $match: 
        { "lastVisited.user": "AAA" }
    },
    { "$unwind":"$lastVisited"},
    { $match:{
        "lastVisited.user": "AAA"
    }},
    { "$sort": { "lastVisited.timestamp": 1 } }    
    
    ])