Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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:加强友谊关系并返回用户的朋友_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 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

我试图在mongoose中向我的用户模式中添加一个实例方法,该方法返回用户的好友的其他用户的集合

用户模式:

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,谢谢你的回答,根据你的回答,我已经取得了一些进展,但我有一个小问题。请看问题。猫鼬中有一个非常简单的功能,叫做“种群”,可以解决你的问题。有了这个功能,你不再需要第二个查询了