繁体   English   中英

使用javascript查询Mongo集合中的数据

[英]Querying data from Mongo collection using javascript

这是我第一次将mongo用于流星项目,这是为了帮助一群用户协作阅读圣经。 集合的数据结构如下:

//collection is named as 'logs'
[
    {
        _id: someObjectId,
        startPage: 1,
        finishPage: 4,
        status: 'in progress',
        userId: someUserId1
    },
    {
        _id: someObjectId,
        startPage: 5,
        finishPage: 10,
        status: 'done',
        userId: someUserId2
    }
    //.... and so on and normally two users wont read the same page.
]

我正在尝试找出以下几点:

  • 总页数“完成”
  • 总页数“进行中”
  • 下一个可用页面
  • 页面缺失

现在由于我对mongo的了解有限,所以我被困在这一点上。 我一直在研究各种解决方案,但不确定哪一种是合适的:

  1. 汇总(但我不清楚如何获得所需的数据)
  2. MapReduce(应该在每次添加新日志或仅将MapReduce用作批处理作业时使用)
  3. 创建一个新的单独集合,该集合将保存所有跟踪数据,并在每次添加或更新日志时对其进行更新

例如

 [
    {
        page: 1,
        inProgress: 0, //users would normally not read the same page twice but they may
        done: 1
    },
    {
        page: 2,
        inProgress: 1, //users would normally not read the same page twice but they may
        done: 0
    }
]

如果有人可以对此做一些更深入的了解,我将不胜感激。 这可能很明显,但是我发现它有点困难。 谢谢。

我会尝试根据您要实现的用途对文档进行建模,如果将日志分成仅读取的页面,则可以进行简单的分组依据。

假设我们将您的模型更改为以下内容:

[{
    _id: new ObjectId(),
    pageNumber: 1,
    status: 'in progress',
    userId: 1
},
{
    _id: new ObjectId(),
    pageNumber: 2,
    status: 'in progress',
    userId: 1
},
{
    _id: new ObjectId(),
    pageNumber: 3,
    status: 'in progress',
    userId: 1
},
{
    _id: new ObjectId(),
    pageNumber: 4,
    status: 'in progress',
    userId: 1
},
{
    _id: new ObjectId(),
    pageNumber: 5,
    status: 'in progress',
    userId: 1
},
{
    _id: new ObjectId(),
    pageNumber: 6,
    status: 'done',
    userId: 2
},
{
    _id: new ObjectId(),
    pageNumber: 7,
    status: 'done',
    userId: 2
},
{
    _id: new ObjectId(),
    pageNumber: 8,
    status: 'done',
    userId: 2
},
{
    _id: new ObjectId(),
    pageNumber: 9,
    status: 'done',
    userId: 2
},
{
    _id: new ObjectId(),
    pageNumber: 10,
    status: 'done',
    userId: 2
},
{
    _id: new ObjectId(),
    pageNumber: 9,
    status: 'done',
    userId: 1
},
{
    _id: new ObjectId(),
    pageNumber: 10,
    status: 'done',
    userId: 1
}]

然后,我们可以运行以下聚合查询:

> db.logs.aggregate([ {$group: { _id: { "pageNumber" : "$pageNumber", "status" : "$status"}, count : {$sum : 1}}} ]).pretty()
{ "_id" : { "pageNumber" : 8, "status" : "done" }, "count" : 1 }
{ "_id" : { "pageNumber" : 7, "status" : "done" }, "count" : 1 }
{ "_id" : { "pageNumber" : 6, "status" : "done" }, "count" : 1 }
{ "_id" : { "pageNumber" : 4, "status" : "in progress" }, "count" : 1 }
{ "_id" : { "pageNumber" : 9, "status" : "done" }, "count" : 2 }
{ "_id" : { "pageNumber" : 3, "status" : "in progress" }, "count" : 1 }
{ "_id" : { "pageNumber" : 10, "status" : "done" }, "count" : 2 }
{ "_id" : { "pageNumber" : 2, "status" : "in progress" }, "count" : 1 }
{ "_id" : { "pageNumber" : 5, "status" : "in progress" }, "count" : 1 }
{ "_id" : { "pageNumber" : 1, "status" : "in progress" }, "count" : 1 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM