Node.js Mongoose:加强友谊关系并返回用户的朋友
我试图在mongoose中向我的用户模式中添加一个实例方法,该方法返回用户的好友的其他用户的集合 用户模式:Node.js Mongoose:加强友谊关系并返回用户的朋友,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图在mongoose中向我的用户模式中添加一个实例方法,该方法返回用户的好友的其他用户的集合 用户模式: var User = new Schema({ username : String, password: String }); var FriendShip = new Schema({ user_id: String, friend_id: String, accepted: Boolean }); 友谊模式: var User = new
var User = new Schema({
username : String,
password: String
});
var FriendShip = new Schema({
user_id: String,
friend_id: String,
accepted: Boolean
});
友谊模式:
var User = new Schema({
username : String,
password: String
});
var FriendShip = new Schema({
user_id: String,
friend_id: String,
accepted: Boolean
});
我创建了两个方法来返回用户的好友id
// Return id of users that are friends of this instance
User.methods.myFriendsId = function () {
var friendship = this.model('Friend').find({user_id: this._id, accepted: true});
var friends_id = {};
for (f of friendship) {
friends_id[friends_id.length] = f.friend_id;
}
return friends_id;
};
// Returns id of users that have this instance as friend
User.methods.friendOfId = function () {
var friendship = this.model('Friend').find({friend_id: this._id, accepted: true});
var friends_id= {};
for (f of friendship) {
friends_id[friends_id.length] = f.user_id;
}
return friends_id;
};
然后我有了应该返回朋友的方法我
.concat()
两种方法的结果,然后尝试通过朋友id
循环查找每个用户
User.methods.friends = function () {
var friends_id = this.myFriendsId().concat(this.friendOfId());
var friends = {};
for (id of friends_id) {
this.model('User').findById(id, function(err, user) {
friends[friends.length] = user;
});
}
return friends;
};
当我在用户
实例上调用user.friends()
时,我想获得一组朋友
编辑
你好@Reto,很抱歉这么晚才给你回复,我正在利用空闲时间学习nodejs,我还没有很多这样的课程
感谢您的推荐,我现在已经了解了Nodejs异步调用是如何工作的,我还了解了mongodb承诺,并且仅仅说“变量等于承诺”并没有得到任何返回<代码>var friends_id=User.find()代码>。虽然我最初试图避免传递回调,因为我希望能够在我的ejs
视图中正确调用该方法,但我发现这是不可能的,因此我找到了更好的方法将数据传递给视图。我还学习了如何编写更好的mongodb查询,而不是在我的friends\u id
数组中为每个id
点击数据库
正如您正确指出的,我只是在用node和JavaScript测试waters,我来自C#后台。这就是我所做的
我已经修改了我的友谊
模式,将\u id
(s)存储为ObjectId
,而不是字符串
var Friendship = new Schema({
user_id: Schema.ObjectId,
friend_id: Schema.ObjectId,
accepted: Boolean
});
因为调用必须是异步的,所以我已经去掉了那些返回friends\u id
的函数。所以我的User.methods.friends
函数现在看起来像这样
User.methods.friends = function (callback) {
var id = this._id;
return this.model('Friendship').find({$or: [
{user_id: id}, // check if id is in user_id column
{friend_id: id} // check if id is in friend_id column
]},
function (err, friendships) {
if (err) return err;
var friends_id = friendships.map(function (f) { // This forms an array of whatever you return from it.
return (id.toString() !== f.user_id.toString()) ?
f.user_id : f.friend_id; // return user_id or friend_id if it does not belong to this user.
});
this.model('User').find({_id: {$in: friends_id}}, callback);
});
};
但我有一个新问题,我在这里得到一个类型错误
:
this.model('User').find({u-id:{$in:friends\u-id}}
if (obj && '_id' in obj) continue;
^
TypeError: Cannot use 'in' operator to search for '_id' in User
我在mongodb控制台中尝试了这一点,用户按预期返回
db.users.find({_id: {$in : [
new ObjectId("55f802d3020b2641028819ba"),
new ObjectId("55f80281cf08f091062f9f4c")
]}})
我查找了这个错误,发现的不适用于我。答案是将friends\u id
解析为JSON对象,但不需要,因为我直接从查询中获得它
我曾尝试转换
\u id
.toString()或将它们包装在新ObjectId(\u id)
中,但仍然出现相同的错误。您的方法有很多问题-主要问题是您似乎没有遵循node.js异步执行模型的基本原理。
这与另一种编程语言(如Java)中的典型代码非常不同:
var friends_id = this.model('Friend').find({user_id: this._id, accepted: true});
这不会返回朋友列表!它会返回您仍需要执行的查询或承诺对象。您需要向其传递一个回调方法,该方法将在数据库查询完成时调用
无法在node.js中的模型上编写同步查询DB后返回好友列表的方法。只能编写接受回调方法但不返回任何内容的方法。DB查询完成后,它将执行回调,并将结果列表作为参数传递给回调方法
首先尝试用更简单的示例深入研究node.js编程,确保您完全理解异步编程的工作原理、回调是什么,或者学习“承诺”.Hi@Reto,谢谢你的回答,根据你的回答,我已经取得了一些进展,但我有一个小问题。请看问题。猫鼬中有一个非常简单的功能,叫做“种群”,可以解决你的问题。有了这个功能,你不再需要第二个查询了