簡體   English   中英

如何使用其他集合的子數組數據過濾來自mongo集合子數組的數據

[英]How to filter data from mongo collection subarray with subarray data of other collection

Baiscally 制作一個 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

 });

 });
});

因此,如果我認為正確,您需要執行以下操作:

  1. 根據給定的電子郵件查找注冊
  2. 查找與該用戶相關的好友
  3. 查找尚未在用戶好友列表中的注冊

另外,根據您輸入的內容,我假設 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);
            });
        });
    });
});

PS這個“回調地獄”可以使用promise或await/defer輕松減少

終於可以解決了,下面是解決方案

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

                  }
              })
            });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM