Node.js 从ID'获取用户数据;对象数组中的s
我没有在mongo上做太多的工作,所以来自mysql有点挑战性。我想做的是在我的朋友数组中获取用户的数据,即:他们的姓名、电子邮件等。这是我下面的内容。当我点击某个路由时,我会将我的ID发送到api端点。然后我需要从数组中获取朋友ID,并获取他们的相关信息 数据库中的记录Node.js 从ID'获取用户数据;对象数组中的s,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我没有在mongo上做太多的工作,所以来自mysql有点挑战性。我想做的是在我的朋友数组中获取用户的数据,即:他们的姓名、电子邮件等。这是我下面的内容。当我点击某个路由时,我会将我的ID发送到api端点。然后我需要从数组中获取朋友ID,并获取他们的相关信息 数据库中的记录 { "_id": { "$oid": "5f1b22a427e4624711bdef0e" }, "friends&
{
"_id": {
"$oid": "5f1b22a427e4624711bdef0e"
},
"friends": [{
"$oid": "5f206e15e9b66391246788d6"
}, {
"$oid": "5f2456777656525890dd9c21"
}],
"name": "Joe Smith",
"email": "joesmith@gmail.com",
"mobile": "1233455467889",
}
控制器
exports.getAddedContacts = async (req, res) => {
const userId = req.params.uid;
let friends;
try {
friends = await User.find({ _id: userId });
} catch (err) {
res
.status(500)
.json({ error: "Something went wrong, could not get contacts" });
}
if (!friends || friends.length === 0) {
res.status(404).json({ error: "No contacts found..." });
}
res.status(200).json({ friends: friends });
};
您可以使用聚合,在聚合中使用$match作为管道中的第一个阶段,这样您就可以只隔离一个用户,然后使用populate来获取您的好友文档 以下是一个例子:
db.classes.insert( [
{ _id: 1, title: "Reading is ...", enrollmentlist: [ "giraffe2", "pandabear", "artie" ], days: ["M", "W", "F"] },
{ _id: 2, title: "But Writing ...", enrollmentlist: [ "giraffe1", "artie" ], days: ["T", "F"] }
])
db.members.insert( [
{ _id: 1, name: "artie", joined: new Date("2016-05-01"), status: "A" },
{ _id: 2, name: "giraffe", joined: new Date("2017-05-01"), status: "D" },
{ _id: 3, name: "giraffe1", joined: new Date("2017-10-01"), status: "A" },
{ _id: 4, name: "panda", joined: new Date("2018-10-11"), status: "A" },
{ _id: 5, name: "pandabear", joined: new Date("2018-12-01"), status: "A" },
{ _id: 6, name: "giraffe2", joined: new Date("2018-12-01"), status: "D" }
])
db.classes.aggregate([
{
$match: {
_id: 1
}
}
{
$lookup:
{
from: "members",
localField: "enrollmentlist",
foreignField: "name",
as: "enrollee_info"
}
}
])
你可以在官方网站上了解更多
注意结果,聚合总是返回一个列表,因此您必须执行类似于const[user]=wait result.toArray()的操作
由于您使用mongoose,您也可以尝试在模型上使用populate(),如下所示:
const author=新作者({
_id:new mongoose.Types.ObjectId(),
名字:“伊恩·弗莱明”,
年龄:50
});
author.save(函数(err){
if(err)返回handleError(err);
const story1=新故事({
标题:“皇家赌场”,
作者:作者。_id//从此人处分配_id
});
故事1.保存(函数(错误){
if(err)返回handleError(err);
//就这样!
});
});
故事
findOne({title:'Casino Royale'})。
填充('author')。
执行(功能(错误、故事){
if(err)返回handleError(err);
console.log('作者是%s',story.author.name);
//打印“作者是伊恩·弗莱明”
});
注意:我在您的问题中注意到,您正在将应该是ObjectID
-s数组的内容存储为一个对象数组,该数组包含表示ObjectID
的单个字段字符串,如果您希望填充或查找工作,则必须对此进行更改。我在这里有点困惑,看起来您的示例使用了两个不同的文档,一个用于成员,一个用于类。我只有一个是Users,并且在用户文档中有一个friends数组。我认为引用$lookup解决方案的同一集合没有问题,在第二个集合中,模型用户应该在friends字段中包含self reference,这是可行的,但是另一个问题的主题,我知道其中一个已经得到了回答,所以,我会看看我是否能在当天晚些时候把它挖出来。我真的用findOne和populate让它工作了,谢谢!很高兴听到它帮助了你!