2014-06-05 4 views
-1

В настоящее время у меня есть схемы ПОЛЬЗОВАТЕЛЕЙ с суб док Рассматриваемый Как взглядов «пользовательских» других пользователей, их ID получает вход в зрительском суб- документMongoose/Mongo быстрее иметь отдельные коллекции?

Так, при просмотре, технически это становится все пользователи, затем фильтры через всех просмотренных пользователей [для любого данного пользователя]. Таким образом, вы получаете список уникальных/свежих пользователей.

Мой метод в настоящее время выборка списка пользователей - Query 1 Затем его извлечение списка просмотренных пользователей (для данного пользователя) - Запрос 2 Затем, используя Array.filter функции, чтобы получить список новых пользователей. (с использованием асинхронной параллели для этих запросов)

Вопрос: было бы быстрее иметь отдельный документ/коллекцию, в которой хранится список просматриваемых пользователей для любого данного пользователя. например:

{ 
    userID: 1002, 
    viewedID: 9112 
}, 
{ 
    userID: 1002, 
    viewedID: 9222 
}, 
{ 
    userID: 1002, 
    viewedID: 9332 
} 

Можно ли для меня какие-то, как сделать запрос, который получает мне свежий список пользователей, так что я не должен делать вычисление самим. то пусть манго сделает всю работу.

редактировать, добавляя код, чтобы сделать его более ясным

var ViewedSchema = new Schema({ 
    coupleId: {type: Number, required: true} 
}); 


var UserSchema = new Schema({ 
    name : { type: String, trim: true, required: true} 
    , partnerId : { type: Number} 
    , viewed : [ViewedSchema] 
}); 

код для просмотра партнеров/пользователей, которые не были просмотрены перед тем

async.parallel([ 
    function(callback) { 
     //gets all the users/partners 
     User.find({}, function(err, users) { 
      var allPartners = []; 
      users.forEach(function(user){ 
       if(allPartners.indexOf(user.partnerId) == -1) { 
        allPartners.push(user.partnerId); 
       } 
      }); 
      callback(null, allPartners); 
     }); 
    }, 

    function(callback) { 
     //gets all the users/partners i have already viewed 
     var votedPartners = [];   
     User.findById(id, function(err, user) { 
      user.viewed.forEach(function(user){ 
       votedPartners.push(user.coupleId); 
      }); 

      callback(null, votedPartners); 
     }); 
    } 
], 
    function(err, result) { 
     //gets the differences between the 2 arrays 
     function exists(element) { 
      return (result[1].indexOf(element) == -1); 
     } 

     var showPartners = result[0].filter(exists); 

     User.find({partnerId: showPartners[0]}, function(err, user){ 
      var json = {objects: user};  
      res.render('index', json); 
     });   
    }); 
}; 

ответ

2

Я не уверен, что вы имеете в виду свежие или новых пользователей, но вы зашли в команду distinct()? Вы можете использовать его, чтобы получить все уникальные просмотренные идентификаторы пользователей для всех пользователей в коллекции, что и похоже на то, что вы хотите сделать. См http://docs.mongodb.org/manual/reference/method/db.collection.distinct/

Из документации: Возвращает массив различных значений поля в SKU поддокументе пункта из всех документов в коллекции заказов: db.orders.distinct («item.sku»)

Если вы приводите пример своей текущей схемы документа, я могу попытаться написать точный запрос для вас.

Редактировать: вы можете использовать $ nin, чтобы найти userIds, которые не указаны в данном списке. Вот пример, который я установил в своем местном Mongo:

> db.dating.insert({"userId":100,"viewedId":["200","201"]}) 

> db.dating.findOne() 

{ 
     "_id" : ObjectId("5398d81799b228e88aef2441"), 
     "userId" : 100, 
     "viewedId" : [ 
       "200", 
       "201" 
     ] 
} 

> db.dating.insert({"userId":200,"viewedId":[""]}) 
> db.dating.insert({"userId":201,"viewedId":[""]}) 
> db.dating.insert({"userId":202,"viewedId":[""]}) 
> db.dating.insert({"userId":203,"viewedId":[""]}) 
> db.dating.insert({"userId":204,"viewedId":[""]}) 
> db.dating.insert({"userId":205,"viewedId":[""]}) 

> db.dating.find({"userId":{$nin: [200,201]}}) 

{ "_id" : ObjectId("5398d81799b228e88aef2441"), "userId" : 100, "viewedId" : [ " 
200", "201" ] } 
{ "_id" : ObjectId("5398d84099b228e88aef2444"), "userId" : 202, "viewedId" : [ " 
" ] } 
{ "_id" : ObjectId("5398d84799b228e88aef2445"), "userId" : 203, "viewedId" : [ " 
" ] } 
{ "_id" : ObjectId("5398d85699b228e88aef2446"), "userId" : 204, "viewedId" : [ " 
" ] } 
{ "_id" : ObjectId("5398d85c99b228e88aef2447"), "userId" : 205, "viewedId" : [ " 
" ] } 
+0

Я не совсем понимаю, я не думаю, что правильно описал себя. Рассмотрите приложение для знакомств, которое показывает ВАС женщин, как только вы просмотрите женщину, приложение не покажет вам ее снова. Таким образом, база данных регистрирует всех женщин, которых вы просмотрели. Таким образом, он должен забрать всех женщин в базе данных, затем он выберет всех женщин, которых вы просмотрели, а затем просто покажите вам разницу, то есть те, которые вы еще не просмотрели [fresh, lol] – Neo

+0

Я добавил мой код – Neo

+0

Обновлен, чтобы проиллюстрировать использование $ nin – lmyers

Смежные вопросы