簡體   English   中英

MongoDB查找所有匹配數組,返回的不僅是唯一的

[英]MongoDB Find All Matching array, return all not just unique

我有一個用戶集合。 在該集合中,每個用戶輸入獎品時,獎品ID將存儲在其個人資料中。 在下面導出典型的用戶文檔

{ 
    "_id" : ObjectId("5aacff47c67f99103bcbf693"), 
    "firstName" : "Test", 
    "lastName" : "Test", 
    "password" : "$2a$10$mJjzPFWuYPmK8A07nc284O8g9SStFpuaVzfyWOZgaCmVaomIxk5qO", 
    "email" : "test1@test.com", 
    "points" : NumberInt(6), 
    "prizes" : [
        ObjectId("5aafd1673a5b2cb294b69620"), 
        ObjectId("5aafd1673a5b2cb294b69620"), 
        ObjectId("5aafd1673a5b2cb294b69620"), 
        ObjectId("5aafd1673a5b2cb294b69620"), 
        ObjectId("5aafd1673a5b2cb294b69620"), 
        ObjectId("5ab28ca784aa6390aa5a1dba")
    ], 
    "messages" : [

    ], 
    "__v" : NumberInt(26)
}

我寫了一個api調用,當用戶登陸其帳戶頁面時,它將找到該用戶並返回其全部獎勵(獎勵陣列)。 然后,我想使用這些查詢數據庫來查找每個條目的標題/內容,以便可以將其顯示在前端。

我已經做到了兩種方式

var prizes = user.prizes

       //mongo

       ids = prizes.map(function(el) { return mongoose.Types.ObjectId(el) })

       Prize.aggregate([
        { $match: { "_id": { "$in": ids } } }

      ], function(err, ret){
        if (err) {
            return res.status(500).json({
                title: 'An error occurred',
                error: err
            });

        }
          console.log(ret)
      }
    )

要么

Prize.find( { _id: prizes }, { title: 1, content: 1 }, function(err, ret){
        if (err) {
            return res.status(500).json({
                title: 'An error occurred',
                error: err
            });

        }
console.log(ret)



       })

現在最困難的部分是,這兩個操作僅返回唯一的文檔(2),而不返回我想要的6個文檔。

我想查找每個條目ID,然后返回該獎項ID的標題和內容,而不關心是否唯一或是否有響應,因此給我高於它的用戶將返回

{1x唯一文檔數4} {1x唯一文檔數1}

或返回6個響應。

即使當我使用.count()時,它也只計為2。我知道我一定會以錯誤的方式進行處理,因為mongo是正確的,因為我要它查找與id匹配的文檔,然后將它傳遞給它找到兩個匹配的ID並將其投放。

我是否通過要求它做一些不同的事情來破壞它的功能? 還有其他選擇嗎? 將其包裝在每個in節點的a中,然后手動查詢每個id並推送到數組?

獲取特定用戶的獎品。

$unwind$group不計算獎品數,然后$lookup獲取3.4中的獎品字段。

User.aggregate([
  {"$match":{"_id":mongoose.Types.ObjectId(userid)}},
  {"$unwind":"$prizes"},
  {"$group":{"_id":"$prizes","count":{"$sum":1}}},
  {"$lookup":{
    "from":"prizes", // name of the prize collection
    "localField":"_id", 
    "foreignField":"_id",
    "as":"prizes"
  }},
  {"$addFields":{"prizes":{"$arrayElemAt":["$prizes",0]}}}
])

獲得用戶和獎品。

使用$lookup$map來阻止字段查找,並使用$filter$size來計算3.4中每個id的獎品數量。

就像是

User.aggregate([
  {"$match":{"_id":mongoose.Types.ObjectId(userid)}},
  {"$lookup":{
    "from":"prizes", // name of the prize collection
    "localField":"prizes",
    "foreignField":"_id",
    "as":"prizeinfo"
  }},
  {"$addFields":{
    "prizeinfo":{
      "$map":{
        "input":"$prizeinfo",
        "as":"pi",
        "in":{
          "title":"$$pi.title",
          "content":"$$pi.content",
          "count":{
            "$size":{
              "$filter":{
                "input":"$prizes",
                "as":"p",
                "cond":{"$eq":["$$pi._id","$$p"]}
              }
            }
          }
        }
      }
    }
  }}
])

暫無
暫無

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

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