我正在開發一個類似于 Tinder 的約會應用程式,現在,我正在node-express-mongodb-mongoose服務器上作業,但我遇到了問題。問題是,當應用程式加載時,在主頁中,我想獲取所有組態檔,不包括我的組態檔和我已經通過(不喜歡)的組態檔。下面是這個函式在節點中的路由:
用戶架構:
const userSchema = new mongoose.Schema({
email: {
type: 'string',
unique: [true, 'Email ID already present.'],
required: true,
},
password: {
type: 'string',
required: true,
minlength: 4,
},
displayName: {
type: 'string',
required: false,
default: '',
},
photoURL: {
type: 'string',
required: false,
default: '',
},
job: {
type: 'string',
required: false,
default: '',
},
age: {
type: 'number',
required: false,
default: null,
},
passes: {
type: 'Array',
required: false,
},
likes: {
type: 'Array',
required: false,
},
matches: {
type: 'Array',
required: false,
}
}
);
mongoose.model('User', userSchema);
獲取組態檔路線:
const id = req.user._id;
try {
const currentUser = await User.findById({_id: id}); // gets the current user
const passes = currentUser.passes; // gets the passed/disliked profiles (array of objects)
const users = await User.find(); // gets all the registered users from db
console.log(passes);
const allUsers = [...passes, ...users]; // combining the 2 arrays
console.log('ALL USERS: ' allUsers);
const usersAfterFilter = allUsers.filter(
(user) => user._id.toString() !== id.toString() // finally filtering because I want to fetch all the profiles excluding mine and the ones' which I have passed.
);
console.log('ALL USERS AFTER FILTER: ' usersAfterFilter);
res.send({'response': 'success', 'data': usersAfterFilter});
} catch (error) {
console.log(error.message);
return res.status(422).send({response : error.message});
}
以下是日志輸出:
[
[
{
_id: new ObjectId("612131375a7fd116969e298c"),
email: '',
password: '',
displayName: 'Yolo',
photoURL: '',
job: 'CEO of World',
age: 22,
passes: [],
likes: [],
matches: [],
createdAt: 2021-12-12T10:38:47.967Z,
updatedAt: 2021-12-12T10:39:14.943Z,
__v: 0
}
]
]
ALL USERS: [object Object],{
_id: new ObjectId("612131375a7fd116969e298c"),
email: '',
password: '',
displayName: 'Yolo',
photoURL: '',
job: 'CEO of World',
age: 22,
passes: [],
likes: [],
matches: [],
createdAt: 2021-12-12T10:38:47.967Z,
updatedAt: 2021-12-12T10:39:14.943Z,
__v: 0
},{
_id: new ObjectId("61b5d2395a7fd12347ae2994"),
email: '',
password: '',
displayName: 'your actor',
photoURL: '',
job: 'Actor',
age: 25,
passes: [ [ [Object] ] ],
likes: [],
matches: [],
createdAt: 2021-12-12T10:39:46.347Z,
updatedAt: 2021-12-12T10:41:36.627Z,
__v: 0
}
Cannot read properties of undefined (reading 'toString')
如您所見,當我將兩個陣列組合用于過濾目的時,...passes轉換為[object Object]并因此破壞了過濾的目的,因為我無法再進行比較id。
如果有人能在這里幫助我,我將不勝感激!
uj5u.com熱心網友回復:
...當應用程式加載時,在主頁中,我想獲取所有組態檔,不包括我的組態檔和我已經通過(不喜歡)的組態檔。
下面演示了如何獲取所需的資料。假設集合中有一些檔案users,下面從mongoshell運行。
示例檔案:
{ _id: 1, passes: [ 3, 4, 5 ] }, { _id: 2 }, { _id: 3 }, { _id: 4 }, { _id: 5 }, { _id: 9 }
請注意,當前用戶是_id: 1with passes: [ 3, 4, 5 ]。輸出將是 ids: [ 2, 9 ]。
查詢:
您可以使用以下任何一種方法來獲得所需的結果。第一種方式:
var currentUser = db.users.findOne({ _id: 1 });
var passedUsers = currentUser.passes;
var allUsers = db.users.find().toArray();
passedUsers.push(currentUser._id);
allUsers.filter(user => (passedUsers.findIndex(passedUser => user._id == passedUser)) == -1)
輸出: [ { "_id" : 2 }, { "_id" : 9 } ]
在第二個方法:
var currentUser = db.users.findOne({ _id: 1 });
var passedUsers = currentUser.passes;
passedUsers.push(currentUser._id);
db.users.find( { _id: { $nin: passedUsers }} ).toArray();
在第三個方式,這使用單個聚集查詢:
db.users.aggregate([
{
$match: { _id: 1 }
},
{
$lookup: {
from: "users",
let: { idVar: "$_id" , passesVar: "$passes" },
pipeline: [
{
$match: {
$expr: {
$not: { $in: [ "$_id", { $concatArrays: [ "$$passesVar" , [ "$$idVar" ] ] } ] }
}
}
},
],
as: "usersAfterFilter"
}},
{
$project: {
usersAfterFilter: 1,
_id: 0
}}
])
輸出: { "usersAfterFilter" : [ { "_id" : 2 }, { "_id" : 9 } ] }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/380249.html
標籤:javascript 节点.js MongoDB 表达 猫鼬
