我如何通过节点js(猫鼬)执行此mongodb查询。 我有两个带有以下模式的表, 我想从用户表中获取用户名和密码,并从信息表中获取全名。
var infoSchema = mongoose.Schema({ khatam_id:字串, user_id:字符串, 全名:字符串, });
var usersSchema = mongoose.Schema({ user_id:字符串, 用户名:字符串, 密码:字符串, });
答案 0 :(得分:0)
在机器上安装猫鼬
npm install mongoose
导入猫鼬lib
const mongoose = require('mongoose');
const Schema = mongoose.Schema, ObjectId = Schema.ObjectId;
连接到mongodb并为表创建架构
mongoose.connect('mongodb://localhost/myappdatabase');
const usersSchema = new Schema({
_id: ObjectId,
user_id: String,
username: String,
fullname: String
});
const Users = mongoose.model('Users', usersSchema );
使用mongo查询从“用户”表中查找用户
Users.find({<here you can write your mongo query>}, function (err, docs) {
// docs.forEach
});
答案 1 :(得分:0)
您必须使用汇总
db.users.aggregate([
{
$lookup:
{
from: "info",
localField: "user_id",
foreignField: "_id",
as: "userInfo"
}
},
{ "$unwind": "$userInfo" },
])
答案 2 :(得分:0)
我不知道你是不是一个热门人物,但是如果你是,你可以使用它。
userSchema.virtual('infos',
{
ref: 'Info',
localField: 'user_id',
foreignField: 'user_id',
})
假设您将infoSchema作为Info模型命名,mongodb会将其转换为infos,以防万一您不知道为什么将虚拟字段称为infos ref显然是对Info模型的引用 localField是引用userSchema唯一ID的字段,而foreignField是u在infoSchema中引用的字段,该字段与u提到的localfield的唯一值匹配。 最后,连同userSchema中的所有字段一起添加
{
toJSON: { virtuals: true },
toObject: { virtuals: true },
}
所以当您查询用户时 试试看,它真的很方便。 注意:它实际上并没有在数据库中创建一个字段(虚拟duh。)它只是填充您的响应对象以进行前端渲染,实际上效果更好。
答案 3 :(得分:0)
连接到MongoDB:在程序执行之前,请确保MongoDB服务正在运行。
var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/your-database");
mongoose.Promise = global.Promise;
var connection = mongoose.connection;
connection.once('open', function() {
console.log('connected to database);
});
connection.on('error', function() {
console.error('Mongoose connection error");
});
process.on('SIGINT', function() {
mongoose.connection.close(function() {
console.log('Mongoose connection disconnected due to app SIGINT.');
});
});
创建用户架构:
const Schema = mongoose.Schema;
const usersSchema = new Schema({
user_id: String,
username: String,
fullname: String
});
const Users = mongoose.model('Users', usersSchema );
像这样运行查询:
Users.findOne({query})
.then(function(user){
// do something
})
.catch(function(err){
// handle error
})
答案 4 :(得分:0)
您可以使用此查询来获取所需的记录类型:
db.users.aggregate([
{ $lookup: {
from: "info",
localField: "user_id",
foreignField: "user_id",
as: "userInfo"}},
{ "$unwind": "$userInfo" }])
答案 5 :(得分:0)
假设您知道如何设置安装猫鼬和连接数据库,并且只需要正确的查询,就让我与您提供的模型分享一些我注意到的内容。我认为不需要2个集合,因为您可以在一个集合下存储同一内容,因为这样可以节省从信息架构中查找用户数据的时间。因此用户架构可以是
var usersSchema = mongoose.Schema({
user_id: String,
username: String,
password: String,
khatam_id: String,
fullname: String
});
使用以下查询,您可以获取用户详细信息
Users.findOne({})
.then(function(user){
// do something
})
.catch(function(err){
// handle error
})
与使用聚合查询或猫鼬填充函数相比,它效率更高,速度更快。
如果上述方法不适合您,则可以尝试使用猫鼬填充功能。
UserSchema = new mongoose.Schema({
user_id: String,
password: String,
},
// schema options: Don't forget this option
// if you declare foreign keys for this schema afterwards.
{
toObject: {virtuals:true},
// use if your results might be retrieved as JSON
// see http://stackoverflow.com/q/13133911/488666
//toJSON: {virtuals:true}
});
UserInfoSchema = new mongoose.Schema({
user_id: String,
khatam_id: String,
username: String,
fullname: String,
});
// Foreign keys definitions
UserSchema.virtual('userDetails', {
ref: 'UserInfoSchema',
localField: 'user_id',
foreignField: 'user_id',
justOne: true // for many-to-1 relationships
});
// Models creation
var UserSchema = mongoose.model('UserSchema', UserSchema);
var UserInfoSchema = mongoose.model('UserInfoSchema', UserInfoSchema);
// Querying
UserSchema.find({...})
// if you use select() be sure to include the foreign key field !
.select({.... user_id ....})
// use the 'virtual population' name
.populate('userDetails')
.exec(function(err, books) {...})