Javascript 如何使用其他集合的子阵列数据过滤mongo集合子阵列中的数据

Javascript 如何使用其他集合的子阵列数据过滤mongo集合子阵列中的数据,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,在node.js中,mongodb添加好友功能可以选择列表用户添加好友列表、发送好友请求、接受好友请求、删除好友请求、阻止好友请求 注册集合 const mongoose = require('mongoose'); const Schema = mongoose.Schema; let Register = new Schema( First_Name:{ type: String, required: true }, Las

在node.js中,mongodb添加好友功能可以选择列表用户添加好友列表、发送好友请求、接受好友请求、删除好友请求、阻止好友请求

注册集合

const mongoose = require('mongoose');

const Schema = mongoose.Schema;


let Register = new Schema(
    First_Name:{
        type: String,
        required: true   
    },
    Last_Name: {
        type: String
    },
    Email: {
        type: String,
        unique: true,
        lowercase: true,
        required: true
    },
    Friends:[{type: String}],  
});

module.exports = mongoose.model('Register', Register);
朋友收藏

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
var ObjectId = require('mongodb').ObjectID;
let Friends = new Schema({
    Requester: {
        type: ObjectId,
        required: true
    },
    Recipients: [{Recipient:{type:ObjectId},Status:{type:Number}}],


}); 
module.exports = mongoose.model('Friends', Friends);
内部Node.js Post API

var Register = require('../models/register.model');
var Friends =require('../models/friends.model');

router.post('/getdata',function(req,res)
{
let Email="example@example.com";

Register.findOne({ Email : Emails }, function(err, user) {

Friends.findOne({ Requester :user._id  }, function(err, user1) {

Register.find({$and:[{Friends:{$nin:[user._id]}},{_id:{$ne:user1.Recipients.Recipient}}]},function(err, user2) {

console.log("user2",user2);

//Here User2 data is not coming

//How to get data so can able to list user that is not added yet in FriendList

//Mainly user1.Recipients.Recipient this is not working because //Recipients is array so how can match all data with array, if i am //using loop then find return data scope ends on inside find closing //braces only.


//Any suggestion

 });

 });
});

因此,如果我的答案正确,您需要执行以下操作:

  • 根据给定的电子邮件查找注册
  • 查找与此用户相关的朋友
  • 查找尚未在用户好友列表中的注册
  • 另外,根据你键入的内容,我假设A可以是B的朋友,但这并不意味着B是A的朋友

    虽然您当前拥有的数据结构对此可能不是最佳的,但我将向您展示针对此问题的适当查询:

    var Register = require('../models/register.model');
    var Friends =require('../models/friends.model');
    
    router.post('/getdata',function(req,res) {
        const email = "example@example.com";
    
        Register.findOne({ Email: email }, function(err, user) { 
            if (err) {
                 console.error(err);
                 return;
            }
    
            Friends.findOne({ Requester: user._id }, function(err, friend) {
                if (err) {
                    console.error(err);
                    return;
                }
    
                const reciptientIds = friend.Recipients.map(function (recipient) {
                    return recipient.Recipient.toString();
                });
    
                Register.find({Friends: { $ne: user._id }, {_id: { $nin: recipientIds }}, function(err, notFriendedUsers) {
                    if (err) {
                        console.error(err);
                        return;
                    }
    
                    console.log(notFriendedUsers);
                });
            });
        });
    });
    

    注:这种“回调地狱”可以通过承诺或等待/延迟来轻松减少,最终能够解决它,下面是解决方案

    var Register = require('../models/register.model');
    var Friends =require('../models/friends.model');
    
    router.post('/getdata',function(req,res)
    {
    let Emails="example@example.com";
    
     Register.findOne({$and:[{ Email : Emails}] }, function(err, user) { 
                  if (err) {
                       console.error(err);
                       return;
                  }
    
                  Friends
                  .findOne({ Requester: user._id }, 
                        { _id: 0} )
                  .sort({ Recipients: 1 })
                  .select( 'Recipients' )
                  .exec(function(err, docs){
                      docs = docs.Recipients.map(function(doc) { 
                        return doc.Recipient; });
                      if(err){
                          res.json(err)
                      } else {
                        console.log(docs,"docs");
                          Register.find({$and:[{Friends: { $ne: user._id }},{_id: { $nin: docs }},{_id:{$ne:user._id}}]}, function(err, notFriendedUsers) {
                            if (err) {
                                console.error(err);
                                return;
                            }
    
                            console.log(notFriendedUsers);
                        });
    
                      }
                  })
                });
    

    获取此错误类型错误:无法读取CoreMongoosArray.map(console.log(recipient.recipient)上未定义的属性“toString”给未定义的人我输入了一个错误:它当然应该是
    收件人。收件人
    。而不是
    收件人。收件人
    不,我也试过了,我可以给你发送屏幕截图,但你的解决方案为我提供了获得最终解决方案的线索,非常感谢。酷:)请确保选择正确的答案,并根据您的发现更新答案;)没有人,我不能从你的答案中得到完整的解决方案,但这很有帮助,为什么我选择它是有帮助的,你可以尝试自己编码,我不知道如何附加屏幕截图,所以可以附加在这里,以清除这件事。