簡體   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