获取具有一个值的唯一数组值记录

时间:2016-02-25 08:07:58

标签: mongodb meteor

我在我的应用程序中有交换平台,并且我以下列格式保存每条消息

{
   userIds: [ 'user1Id', 'user2Id' ],
   msg: "message",
   sentBy: 'user1',
   sentAt: new Date()
}


{
   userIds: [ 'user1Id', 'user3Id' ],
   msg: "message",
   sentBy: 'user1',
   sentAt: new Date()
}


{
   userIds: [ 'user1Id', 'user2Id' ],
   msg: "message",
   sentBy: 'user1',
   sentAt: new Date()
}

有没有办法从集合中获得独特的对话?

例如,从上面的列表我想得到

  {
       userIds: [ 'user1Id', 'user2Id' ],
       msg: "message",
       sentBy: 'user1',
       sentAt: new Date()
    }


    {
       userIds: [ 'user1Id', 'user3Id' ],
       msg: "message",
       sentBy: 'user1',
       sentAt: new Date()
    }

这两条记录,

这里有什么mongo查询?

除了查询所有记录还有其他方法可以手动执行吗?

或任何人建议使用更好的架构,我刚开始使用此功能,因此我可以更改架构。

我考虑使用

{
   userIds: [ 'user1Id', 'user2Id' ],
   msgs: [
    {
       msg: "message",
       sentBy: 'user1',
       sentAt: new Date()
    },
    {
       msg: "message",
       sentBy: 'user2',
       sentAt: new Date()
    }
  ],
   modifiedAt: new Date()
}

但决定反对它,因为只要有新的msg添加到msgs数组,整个字段就会被发送到客户端,所以使用第一个模式。

任何建议都是适用的。感谢。

2 个答案:

答案 0 :(得分:1)

你可以使用聚合来做到这一点,

.aggregate([{$组:{_ ID:" $的userIds"}}])

请参阅this了解更多详情

您可以使用$ project选项将返回文档作为您希望的格式。

答案 1 :(得分:0)

我建议您只使用聚合。例如:

  db.test.aggregate( {$group: {_id: "$userIds" } } )

将返回

{
    "result" : [
        {
            "_id" : [
                "user1Id",
                "user3Id"
            ]
        },
        {
            "_id" : [
                "user1Id",
                "user2Id"
            ]
        }
    ],
    "ok" : 1
}

您可以在文档Aggregation-Distinct中找到更多详细信息。