簡體   English   中英

貓鼬:僅從嵌入式文檔數組中返回一個嵌入式文檔

[英]Mongoose: Only return one embedded document from array of embedded documents

我有一個包含嵌入式文檔數組的模型。 嵌入的文檔跟蹤用戶在給定活動中獲得的積分。 由於用戶可以是多個活動的一部分,也可以只是一個活動,因此將這些活動排列成一個數組是有意義的。 現在,我想提取名人堂,即給定活動的前十名用戶。 目前,我正在這樣做:

userModel.find({ "stats.activity": "soccer" }, ["stats", "email"])
.desc("stats.points")
.limit(10)
.run (err, users) ->

(如果您想了解語法,那是咖啡腳本)

其中“統計”是嵌入式文檔/活動的數組。

現在這實際上可以工作,但是目前我僅對只有一項活動的帳戶進行測試。 我假設一旦用戶進行更多活動,就會出問題(按排序)。 無論如何,我可以告訴貓鼬只返回嵌入式文檔,其中“ activity” ==“ soccer”與頂級文檔一起嗎?

順便說一句,我意識到我可以通過另一種方式來做到這一點,即在其自己的集合中擁有統計信息,並向相關用戶提供db-ref,但我想知道在考慮任何重寫之前是否有可能這樣做。

謝謝!

您是正確的,一旦陣列中有多個活動,該功能將無法使用。

具體來說,由於您不能只返回包含該元素的數組的任意子集,因此您將獲得所有信息,並且排序將應用於所有點,而不僅僅是與“活動”配對的那些點: ”。

不過,您可以對架構進行一個非常簡單的調整,以解決此問題。 不要將活動名稱存儲為值,而將其用作鍵。

{ _id: userId,
  email: email,
  stats: [
    {soccer : points},
    {rugby:   points},
    {dance:   points}
  ]
}

現在,您將能夠像這樣查詢和排序:

users.find({"stats.soccer":{$gt:0}}).sort({"stats.soccer":-1})

請注意,當您移至版本2.2(當前僅可用於不穩定的開發版本2.1)時,無需更改即可使用聚合框架獲取所需的准確結果(僅數組或子文檔的特定子集)。您的架構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM