2016-02-15 45 views
0

,这是我的数据:

> db.bookmarks.find({"userId" : "56b9b74bf976ab70ff6b9999"}).pretty() 
{ 
    "_id" : ObjectId("56c2210fee4a33579f4202dd"), 
    "userId" : "56b9b74bf976ab70ff6b9999", 
    "items" : [ 
     { 
      "itemId" : "28", 
      "timestamp" : "2016-02-12T18:07:28Z" 
     }, 
     { 
      "itemId" : "29", 
      "timestamp" : "2016-02-12T18:07:29Z" 
     }, 
     { 
      "itemId" : "30", 
      "timestamp" : "2016-02-12T18:07:30Z" 
     }, 
     { 
      "itemId" : "31", 
      "timestamp" : "2016-02-12T18:07:31Z" 
     }, 
     { 
      "itemId" : "32", 
      "timestamp" : "2016-02-12T18:07:32Z" 
     }, 
     { 
      "itemId" : "33", 
      "timestamp" : "2016-02-12T18:07:33Z" 
     }, 
     { 
      "itemId" : "34", 
      "timestamp" : "2016-02-12T18:07:34Z" 
     } 
    ] 
} 

我想有像(其实我希望_id能成为用户id太):

{ 
    "_id" : "56b9b74bf976ab70ff6b9999", 
    "items" : [ 
     { "itemId": "32", "timestamp": "2016-02-12T18:07:32Z" }, 
     { "itemId": "31", "timestamp": "2016-02-12T18:07:31Z" }, 
     { "itemId": "30", "timestamp": "2016-02-12T18:07:30Z" } 
    ] 
} 

我现在拥有的一切:

> db.bookmarks.aggregate(
...  { $match: { "userId" : "56b9b74bf976ab70ff6b9999" } }, 
...  { $unwind: '$items' }, 
...  { $sort: { 'items.timestamp': -1} }, 
...  { $skip: 2 }, 
...  { $limit: 3}, 
...  { $group: { '_id': '$userId' , items: { $push: '$items.itemId' } } } 
...).pretty() 
{ "_id" : "56b9b74bf976ab70ff6b9999", "items" : [ "32", "31", "30" ] } 

我试图读取蒙戈的文件,并找出我可以$推,但不知何故,我不能找到一种方法,这样的推对象,它在整个对象的任何地方都没有定义。我想要时间戳也..但我不知道我应该如何修改$组(或其他人??)这样做。感谢您的帮助!

回答

1

此代码,这是我在MongoDB中3.2.1测试壳,应该给你你想要的输出格式:

> db.bookmarks.aggregate( 
{ "$match" : { "userId" : "Ursula" } }, 
{ "$unwind" : "$items" }, 
{ "$sort" : { "items.timestamp" : -1 } }, 
{ "$skip" : 2 }, 
{ "$limit" : 3 }, 
{ "$group" : { "_id" : "$userId", items: { "$push" : { "myPlace" : "$items.itemId", "myStamp" : "$items.timestamp" } } } } ).pretty() 

运行上面会产生这样的输出:

{ 
    "_id" : "Ursula", 
    "items" : [ 
     { 
      "myPlace" : "52", 
      "myStamp" : ISODate("2016-02-13T18:07:32Z") 
     }, 
     { 
      "myPlace" : "51", 
      "myStamp" : ISODate("2016-02-13T18:07:31Z") 
     }, 
     { 
      "myPlace" : "50", 
      "myStamp" : ISODate("2016-02-13T18:07:30Z") 
     } 
    ] 
} 

在MongoDB 3.2.x版中,您还可以在聚合管道的最后阶段使用$ out操作符,并将聚合查询的输出写入集合。下面是我使用的代码:

> db.bookmarks.aggregate( 
{ "$match" : { "userId" : "Ursula" } }, 
{ "$unwind" : "$items" }, 
{ "$sort" : { "items.timestamp" : -1 } }, 
{ "$skip" : 2 }, 
{ "$limit" : 3 }, 
{ "$group" : { "_id" : "$userId", items: { "$push" : { "myPlace" : "$items.itemId", "myStamp" : "$items.timestamp" } } } }, 
{ "$out" : "ursula" }) 

这给了我一个名为 “邦女郎” 集合:

> show collections 
ursula 

,我可以查询该集合:

> db.ursula.find().pretty() 
{ 
    "_id" : "Ursula", 
    "items" : [ 
     { 
      "myPlace" : "52", 
      "myStamp" : ISODate("2016-02-13T18:07:32Z") 
     }, 
     { 
      "myPlace" : "51", 
      "myStamp" : ISODate("2016-02-13T18:07:31Z") 
     }, 
     { 
      "myPlace" : "50", 
      "myStamp" : ISODate("2016-02-13T18:07:30Z") 
     } 
    ] 
} 
> 

所有的最后,这是我在聚合查询中使用的输入文档。您可以将此文档与我如何对聚合查询进行编码以查看构建新项目数组的方式进行比较。

> db.bookmarks.find({ "userId" : "Ursula" }).pretty() 
{ 
    "_id" : ObjectId("56c240ed55f2f6004dc3b25c"), 
    "userId" : "Ursula", 
    "items" : [ 
     { 
      "itemId" : "48", 
      "timestamp" : ISODate("2016-02-13T18:07:28Z") 
     }, 
     { 
      "itemId" : "49", 
      "timestamp" : ISODate("2016-02-13T18:07:29Z") 
     }, 
     { 
      "itemId" : "50", 
      "timestamp" : ISODate("2016-02-13T18:07:30Z") 
     }, 
     { 
      "itemId" : "51", 
      "timestamp" : ISODate("2016-02-13T18:07:31Z") 
     }, 
     { 
      "itemId" : "52", 
      "timestamp" : ISODate("2016-02-13T18:07:32Z") 
     }, 
     { 
      "itemId" : "53", 
      "timestamp" : ISODate("2016-02-13T18:07:33Z") 
     }, 
     { 
      "itemId" : "54", 
      "timestamp" : ISODate("2016-02-13T18:07:34Z") 
     } 
    ] 
} 
+0

啊,我没有想太多这样......不过这只是我的胡乱猜测,我不知道的话,我放弃了一个试用后,也许我错过了一些支架或引用... 反正,你为我确认一下!非常感谢!! –

+0

在这个阶段之后,我发现如何像重命名字段一样,使用'$ project' '{$ project:{userId:“$ _id”,items:1,_id:0}}' –