簡體   English   中英

通過Mongoose,Node.js,MongodDB中的特定屬性查找嵌入式文檔

[英]Finding an Embedded Document by a specific property in Mongoose, Node.js, MongodDB

對於這個應用程序,我使用Node.js,MongoDB,Mongoose和Express

所以我有一個Param對象,其中包含一系列Pivots,我想從樞軸中讀取某些數據,如下所述

---in models.js-------------------------
    var Pivot = new Schema({
    value : String
  , destination : String
  , counter : Number
 });


var Param = new Schema({
    title : String
  , desc : String
  , pivots : [Pivot]
});


------------- in main.js --------------

var Param = db.model('Param');


app.get('/:title/:value', function(req, res){
    Param.findOne({"title":req.param('title')}, function(err, record){
           console.log(record.pivots);
           record.pivots.find({"value":req.param('value')}, function(err, m_pivot){
                    pivot.counter++;
                    res.redirect(m_pivot.destination);
           });
           record.save();
    });
});

我知道代碼工作到console.log(record.pivots),因為我有一個帶有正確的數據透視文檔的doc集合。

但是,似乎沒有一種find方法可以讓我通過模式中定義的'value'屬性匹配嵌入文檔。 是否可以使用.find()或.findOne()搜索這些嵌入文檔數組,如果沒有,是否有一些通過mongoose訪問它的簡單方法?

varunsrin,

這應該做到這一點

app.get('/:title/:value', function(req, res) {
  Param.findOne({'pivots.value': req.param('value'), "title":req.param('title')}},
                function(err, record) {
                  record.pivot.counter++;
                  res.redirect(m_pivot.destination);  
                 record.save();
               });
});

請注意查詢的復數形式以匹配架構中的字段名稱

您可以使用如下嵌入式文檔屬性進行查詢:

{'pivot.value': req.param('value')}}

更新以回應評論:

app.get('/:title/:value', function(req, res) {
  Param.findOne({'pivot.value': req.param('value'), "title":req.param('title')}},
                function(err, record) {
                  record.pivot.counter++;
                  res.redirect(m_pivot.destination);  
                 record.save();
               });
});

這個問題最大的問題是,如果你的req有一些空的字段(應該作為通配符),你就找不到任何東西,因為mongo也試圖匹配空的params,所以搜索{“user”:“bob”,“ color“:”“}與{”user“:”bob“,”color“:”red“}或{”user“:”bob“}不同。 這意味着您必須首先創建一個查詢對象並在傳入之前過濾掉任何未使用的參數,如果您創建一個查詢對象,則不能再執行類似“user.name = ...”的操作,因為mongo interperets這是一個錯誤,因為它不首先將對象文字解析為字符串。 關於這個問題的任何想法?

PS。 你認為制作一個像這樣的對象很容易:user.name =“bob”; user.color: “綠色”; user.signup.time =“12342561”然后只使用user作為查詢對象:/

我想你正在尋找“$ in”關鍵字?

如:

{a: {$in: [10, "hello"]}}

來源: MongoDB查詢CheatSheet

我使用一個簡單的for循環臨時解決它來解析對象數組,如下所示:

for (var i=0; i <record.pivots.length; i++){
   if (record.pivots[i].value == req.param('value')){
      res.redirect(record.pivots.destination);
   } 
}

但是,我仍然認為Mongoose必須有一種更簡單的方式與嵌入式文檔交互 - 這個循環有點慢,特別是當嵌入式文檔的數量變大時。

如果有人建議以更快的方式在js或mongoose函數中搜索此對象數組,請在下面發布。

暫無
暫無

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

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