2017-02-23 54 views
1

我将尝试使用示例数据进行解释。用户可以进行任意数量的评论,但我只想回复评论者的最新评论。查找所有文档,但是如果某些文档具有相同的值,请获取最新的文档

{ 
    id : 1 
    name : "John", 
    review : "only one review" 
    dateCreated : 2017-02-23 02:35:11.420Z 
} 
{ 
    id : 3 
    name : "Sam" 
    review : "second entered" 
    dateCreated : 2017-02-23 02:41:42.300Z 
} 
{ 
    id : 2 
    name : "Sam", 
    review : "fist enterd" 
    dateCreated : 2017-02-23 02:36:32.150Z 
} 

一个.find()应当与ID 1和ID 3.返回文档因为只有一个由John制作和一个id为3是由萨姆成为最后一个。

是否有这样的查询?

我的实际项目比较难,因为我没有name我有userIdanonId。这些字段的值是对象ID。最复杂的部分是文档不包含两者。它包含一个userIdanonId

所以我想我会需要一个或条件也许。 anonId或userId

也许你可以给我关于此的想法。

编辑:

我的实际数据看起来更像是这样的。它更复杂。

{ 
    anonId : ObjectId("58ae4f934a7d2b2490e8f99c") 
    review : review made by an anoymous user 
    dateCreated : 2017-02-23 02:35:11.420Z 
} 
{ 
    anonId : ObjectId("58ae4f934a7d2b2490e8f99c") 
    review : second review made by anonymous user 
    dateCreated : 2017-02-23 05:35:11.420Z 
} 
{ 
    userId : ObjectId("58ae4a5f4a7d2b2490e8f996") 
    review : first review made by authenticated user 
    dateCreated : 2017-02-22 05:35:11.420Z 
} 
{ 
    userId : ObjectId("58ae4a5f4a7d2b2490e8f996") 
    review : second review made by authenticated user 
    dateCreated : 2017-02-25 05:35:11.420Z 
} 

{ 
    userId : ObjectId("58ae5fc7a467cf23947833c8") 
    review : This will be returened because no other review has this userID 
    dateCreated : 2017-02-25 05:35:11.420Z 
} 

回答

1

可以执行降$sortdateCreated$group通过userIdanonId

db.test.aggregate([{ 
    $sort: { 
     "dateCreated": -1 
    } 
}, { 
    $project: { 
     ref: { 
      $cond: { 
       if: { $gt: ["$userId", null] }, 
       then: "$userId", 
       else: "$anonId" 
      } 
     }, 
     document: "$$ROOT" 
    } 
}, { 
    $group: { 
     _id: "$ref", 
     document: { 
      "$first": "$document" 
     } 
    } 
}]) 

注意的是,在$project阶段使用的条件是要检查是否userId存在,否则设置refanonId

Here is a gist

+0

可以说我有20个字段/路径。我应该第一个为他们所有人 –

+0

我已经更新了你的真实用例(使用'userId'和'anonId')并且使用'$$ ROOT'作为嵌套文档来照顾你所有的字段 –

+0

我认为这个使得填充'userId'' anonId'字段更加困难。我可以在此之后填充吗?感谢您的回答。 –

相关问题