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