Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose/Mongo能更快地拥有独立的收藏吗?_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Node.js Mongoose/Mongo能更快地拥有独立的收藏吗?

Node.js Mongoose/Mongo能更快地拥有独立的收藏吗?,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,目前,我有一个模式用户查看了一个子文档 当“用户”查看其他用户时,他们的ID将记录在查看器子文档中 因此,在查看时,从技术上讲,这会获取所有用户,然后通过所有查看的用户(针对任何给定用户)进行过滤。因此,您将获得一个独特/新鲜用户列表 我的方法当前正在获取用户列表-查询1 然后它将获取已查看用户的列表(对于给定用户)-查询2 然后使用array.filter函数获取新用户列表。 (对这些查询使用异步并行) 问题是,仅仅拥有一个单独的文档/集合来存储任何给定用户的已查看用户列表会更快吗。e、 g:

目前,我有一个模式用户查看了一个子文档 当“用户”查看其他用户时,他们的ID将记录在查看器子文档中

因此,在查看时,从技术上讲,这会获取所有用户,然后通过所有查看的用户(针对任何给定用户)进行过滤。因此,您将获得一个独特/新鲜用户列表

我的方法当前正在获取用户列表-查询1 然后它将获取已查看用户的列表(对于给定用户)-查询2 然后使用array.filter函数获取新用户列表。 (对这些查询使用异步并行)

问题是,仅仅拥有一个单独的文档/集合来存储任何给定用户的已查看用户列表会更快吗。e、 g:

{
  userID: 1002,
  viewedID: 9112
},
{
  userID: 1002,
  viewedID: 9222
},
{
  userID: 1002,
  viewedID: 9332
}
对我来说,有没有可能做一个查询,让我得到一个新的用户列表,这样我就不必自己计算了。i、 我们让mongo做所有的工作

编辑,添加代码以使其更清晰

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);
        });         
    });
};

我不确定你所说的新用户或新用户到底是什么意思,但你是否已经熟悉了distinct()命令?您可以使用它来获取集合中所有用户的所有唯一已查看用户ID,这听起来像是您想要做的。看见

从文件中: 从orders集合中的所有文档返回子文档项中字段sku的不同值数组: db.orders.distinct('item.sku')

如果您给出当前文档模式的示例,我可以尝试为您编写精确的查询

编辑:可以使用$nin查找不在给定列表中的用户名。以下是我在本地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" : [ "
" ] }

我不太明白,我想我没有正确地描述自己。考虑一个约会应用程序,显示你的女性,一旦你看过一个女性,应用程序不会再给你看。所以基本上,数据库记录了你看过的所有女性。因此,它需要获取数据库中的所有女性,然后获取您查看过的所有女性,然后向您显示差异,即您尚未查看的女性[fresh,lol]更新以使用$nin进行说明