2016-05-13 84 views
1

我是新來的Mongo,並試圖比較一個數組與收集文件並返回匹配記錄列表。MongoDB-通過比較集合與對象數組的比較集合返回Array的現有字段

讓我解釋一下:第一個數組

我有一個集合(用戶)提供以下文件:

> db.user.find().pretty() 
{ 
    "_id" : ObjectId("57358220bf3e7d076b6ccdb1"), 
    "name" : "Sunny", 
    "phone" : "9417702107", 
    "email" : "[email protected]" 
} 
{ 
    "_id" : ObjectId("57358242bf3e7d076b6ccdb2"), 
    "name" : "Pal", 
    "phone" : "9015719419", 
    "email" : "[email protected]" 
} 
{ 
    "_id" : ObjectId("57358262bf3e7d076b6ccdb3"), 
    "name" : "viveky", 
    "phone" : "8826565107", 
    "email" : "[email protected]" 
} 

第二個數組:我有對象的數組,它是來自的Http下面的請求是數組的結構。

{ 
"contacts" : [ 
      { 
        "name" : "Sunny", 
        "phone" : "9417702107" 
      }, 
      { 
        "name" : "Sukhpal", 
        "phone" : "9015719419" 
      }, 
      { 
        "name" : "anurag", 
        "phone" : "9988776655" 
      }, 
      { 
        "name" : "vivek", 
        "phone" : "8826565107" 
      } 
     ] 
} 

現在我想知道第二個數組的哪些對象是存在於第一個數組,哪些不是。只能比較電話。結果我想要第二個數組相同的數組,但有一個額外的字段是 「存在」:「真」或「存在」:「假」。像這樣的東西。

{ 
    "contacts" : [ 
      { 
        "name" : "Sunny", 
        "phone" : "9417702107" 
        "exists" :"true" 
      }, 
      { 
        "name" : "pal", 
        "phone" : "90177668899" 
        "exists" :"false" 
      } 
      ] 
    } 

所以爲了這個,我曾在這裏嘗試的東西是mongoos Node.js的代碼。

exports.matchcontacts = function(req, res, next) 
{ 
    var response = {}; 
    var conArray = req.body.contacts; 
    var contact_list = []; 

for(var i=0; i<conArray.length;i++) 
{ 
    var name = conArray[i].name; 
    var phone = conArray[i].phone; 

    Users.findOne({"phone":conArray[i].phone},function(err,data) 
    { 
     if(err) 
     { 
      response = {"error" : true,"message" : "Error fetching data"}; 
     } 
     else if(!data) 
      { 
       contact_list.push({name:name,phone:phone,exists:"false"}); 
      } 
     else 
     { 
      contact_list.push({name:name,phone:phone,exists:"true"}); 
     } 

    }); 
    } 
    response = {"error":false,"contacts":contact_list}; 
    res.json(response); 
}; 

但總是得到空{}空的結果,如果我試圖讓回調函數內響應,那麼它僅返回單個去年相比價值。 問題第一個方法是回調函數返回結果很晚所以結果總是空的。 和第二種方法循環覆蓋結果,它也沒有效率使用循環內部的回調它將調用no的時間。所以整個故事,我曾解釋

現在請任何人可以幫助我的代碼或建議權的方式來獲得期望的結果得益於

+0

從來沒有使用MongoDB的,但不容您在您的數據庫中的所有這些手機的手機的數組,搜索(Users.find我相信)並一次處理所有內容?這樣你只需要管理一個回調 – juvian

+0

@juvian我很欣賞你的建議,並且我已經在**運算符中使用了** $,但它返回了所有匹配結果(整個文檔數據)。但是怎樣才能知道哪些記錄沒有找到,並準備有**存在**的字段。和一個更多的東西(用戶集合)「名稱」谷和**第二陣列**「名稱」字段值可以不同。所以我想要名稱值相同**第二陣列**不是從數據庫。 –

+0

'Array.prototype.findIndex()'和'Array.prototype.find()'是你在這個任務中的朋友。 – Redu

回答

1

Haven't使用MongoDB的,但我會用這個想法是先迭代您接觸,使手機的映射到相應的對象,將它們標記爲不存在:

var obj = {}; 

for(var i=0; i<conArray.length;i++){ 
    obj[conArray[i].phone] = conArray[i]; 
    conArray[i].exists = false; 
} 

然後以某種方式對具有這些手機在你的數據庫的用戶搜索,像

var results = Users.find(records that have phone in Object.keys(obj) array) 

最後,你遍歷你existant記錄並標記相應的接觸

for(var i=0;i<results.length;i++){ 
    obj[results[i].phone].exists = true; 
} 
+0

我知道如何添加存在字段,但我不能使用來自User.find()**結果**的「名稱」值。 –

+0

@SunnyDhiman你是什麼意思?爲什麼你需要名稱值?認爲它已經在聯繫人 – juvian

+0

是的,你的權利聯繫人數組已經包含「名稱」字段,但結果,我會得到後的User.find()包含「名稱」值不同於聯繫人數組。這是我無法使用的方式。而不是隻返回數組中的「手機」字段。 –