Mongodb和Node Js

时间:2018-07-09 05:32:00

标签: node.js mongodb

我如何通过节点js(猫鼬)执行此mongodb查询。 我有两个带有以下模式的表, 我想从用户表中获取用户名和密码,并从信息表中获取全名。

var infoSchema = mongoose.Schema({ khatam_id:字串, user_id:字符串, 全名:字符串, });

var usersSchema = mongoose.Schema({ user_id:字符串, 用户名:字符串, 密码:字符串, });

6 个答案:

答案 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) {...})