2013-11-27 103 views
1

我有记录的集合如下MongoDB的自定义排序

{ 
"_id":417, 
"ptime":ISODate("2013-11-26T11:18:42.961Z"), 
"p":{ 

    "type":"1", 
    "txt":"test message" 
}, 

"users":[ 
    { 
     "uid":"52872ed59542f", 
     "pt":ISODate("2013-11-26T11:18:42.961Z") 
    }, 
    { 
     "uid":"524eb460986e4", 
     "pt":ISODate("2013-11-26T11:18:42.961Z") 
    }, 
    { 
     "uid":"524179060781e", 
     "pt":ISODate("2013-11-27T12:48:35Z") 
    } 
], 

}, 

{ 
"_id":418, 

"ptime":ISODate("2013-11-25T11:18:42.961Z"), 
"p":{ 

    "type":"1", 
    "txt":"test message 2" 
}, 

"users":[ 
    { 
     "uid":"524eb460986e4", 
     "pt":ISODate("2013-11-23T11:18:42.961Z") 
    }, 
    { 
     "uid":"52872ed59542f", 
     "pt":ISODate("2013-11-24T11:18:42.961Z") 
    }, 

    { 
     "uid":"524179060781e", 
     "pt":ISODate("2013-11-22T12:48:35Z") 
    } 
], 

} 

如何由大到小的ptime的顺序执行上述记录和整理PT,用户的uid =“52872ed59542f”?

回答

0

您可以使用聚集框架按照如下方式对ptime和users.pt字段进行排序。

db.users.aggregate(
    {$sort : {'ptime' : 1}}, 
    {$unwind : "$users"}, 
    {$match: {"users.uid" : "52872ed59542f"}}, 
    {$sort : {'users.pt' : 1}}, 
    {$group : {_id : {id : "$_id", "ptime" : "$ptime", "p" : "$p"}, users : {$push : "$users"}}}, 
    {$group : {_id : "$_id.id", "ptime" : {$first : "$_id.ptime"}, "p" : {$first : "$_id.p"}, users : {$push : "$users"}}} 
); 
+0

这里不需要$ elemMatch。 – Derick

+0

尽管你需要$匹配! – Derick

1

如果你想这样做,你可能想以不同的方式存储你的数据。在将嵌套文档作为顶级字段操作时,MongoDB通常并没有那么好。在你的情况,我建议拆分出来的ptime,PT和UID到自己的收藏:

消息

{ 
    "_id":417, 
    "ptime":ISODate("2013-11-26T11:18:42.961Z"), 
    "type":"1", 
    "txt":"test message" 
}, 

用户

{ 
    "id":417, 
    "ptime":ISODate("2013-11-26T11:18:42.961Z"), 
    "uid":"52872ed59542f", 
    "pt":ISODate("2013-11-26T11:18:42.961Z") 
}, 
{ 
    "id":417, 
    "ptime":ISODate("2013-11-26T11:18:42.961Z"), 
    "uid":"524eb460986e4", 
    "pt":ISODate("2013-11-26T11:18:42.961Z") 
}, 
{ 
    "id":417, 
    "ptime":ISODate("2013-11-26T11:18:42.961Z"), 
    "uid":"524179060781e", 
    "pt":ISODate("2013-11-27T12:48:35Z") 
} 

然后,您可以设置一个指数uid,ptime和pt的用户集合。

您将需要做两个查询来获取文本消息。

0
db.yourcollection.find(
{ 
    users:{ 
    $elemMatch:{uid:"52872ed59542f"} 
    } 
}).sort({ptime:-1}) 

但是,你会遇到按字段命令的问题。您应该使用Aggregation Framework来投影数据或使用Derick的方法。