【问题标题】:Manipulating Mongoose/MongoDB Array using Node.js使用 Node.js 操作 Mongoose/MongoDB 数组
【发布时间】:2014-09-03 07:12:45
【问题描述】:

我注意到关于如何使用 Mongoosejs 操作对象数组的文档和信息很少。

我有以下用户模型/架构:

'use strict';

/**
 * Module Dependencies
 */

var bcrypt    = require('bcrypt-nodejs');
var crypto    = require('crypto');
var mongoose  = require('mongoose');

 /**
 * Custom types
 */
var ObjectId = mongoose.Schema.Types.ObjectId;

var userSchema = new mongoose.Schema({

  email: { type: String, unique: true, index: true },
  password: { type: String },
  type: { type: String, default: 'user' },
  facebook: { type: String, unique: true, sparse: true },
  twitter: { type: String, unique: true, sparse: true },
  google: { type: String, unique: true, sparse: true },
  github: { type: String, unique: true, sparse: true },
  tokens: Array,

  profile: {
    name: { type: String, default: '' },
    gender: { type: String, default: '' },
    location: { type: String, default: '' },
    website: { type: String, default: '' },
    picture: { type: String, default: '' },
    phone: {
      work: { type: String, default: '' },
      home: { type: String, default: '' },
      mobile: { type: String, default: '' }
    }
  },

  activity: {
    date_established: { type: Date, default: Date.now },
    last_logon: { type: Date, default: Date.now },
    last_updated: { type: Date }
  },

  resetPasswordToken: { type: String },
  resetPasswordExpires: { type: Date },

  verified: { type: Boolean, default: true },
  verifyToken: { type: String },

  enhancedSecurity: {
    enabled: { type: Boolean, default: false },
    type: { type: String },  // sms or totp
    token: { type: String },
    period: { type: Number },
    sms: { type: String },
    smsExpires: { type: Date }
  },

  friends: [{
    friend: { type: ObjectId, ref: 'User' },
    verified: { type: Boolean, default: false }
  }]

});

/* (...) some functions that aren't necessary to be shown here */

module.exports = mongoose.model('User', userSchema);

所以你可以检查我在 User 中定义的 Friends 是这样的:

  friends: [{
    friend: { type: ObjectId, ref: 'User' },
    verified: { type: Boolean, default: false }
  }]

现在的问题是如何在 Node.js 脚本中添加、编辑和删除这个数组?

BOTTOMLINE:如何使用 Node.js 和 Mongoose.js 操作 MongoDB 架构中的数组?我总是必须创建一个 Schema 函数还是可以直接访问它?

编辑 (13/07/2014): 到目前为止,我已经创建了一个 HTTP GET,它为我提供了这样的数组:

app.get('/workspace/friends/:userid', passportConf.isAuthenticated, function (req, res) {
  User.find({_id: req.params.userid}, function (err, items) {
      if (err) {
          return (err, null);
      }
      console.log(items[0].friends);
      res.json(items[0].friends);
  });
});

但这只会返回一个friendIds数组,但是如果我想创建某种'/workspace/friends/:userid/del/:friendid' POST,或者添加POST。我似乎无法弄清楚如何才能完成这项工作。

【问题讨论】:

  • 您可以像使用常规 JavaScript 对象(pushconcat 等)一样执行此操作。您尝试过哪些不起作用的方法?
  • 嘿@aarosil 我对数组发出了 GET 请求,但是如何再次编辑和保存它?

标签: javascript arrays node.js mongodb mongoose


【解决方案1】:

您可以执行以下操作

app.get('/workspace/friends/:userid/delete/:friendId', passportConf.isAuthenticated, function (req, res) {
  User.findOne({_id: req.params.userid}, function (err, user) {
      if (err) {
          return (err, null);
      }
      for (var i = 0; i < user.friends.length; i++) {
        if (user.friends[i]._id === req.params.friendId) {
            user.friends = user.friends.splice(i,1)
        }
      }
      user.save(function(err, user, numAffected){
        if (!err )res.json(user)
        res.send('error, couldn\'t save: %s', err)
      })
  });
});

它在猫鼬docs 中说的是

"回调将接收三个参数,如果发生错误则为err,[model]为保存的[model],numberAffected在数据库中找到并更新文档时为1,否则为0。

fn 回调是可选的。如果没有通过 fn 并且验证失败,则将在用于创建此模型的连接上发出验证错误。”

【讨论】:

  • 如何保存编辑?这就是我不明白的?保存功能不需要返回什么的吗?添加我可以使用什么?验证是否存在 user.friends.push(...)?并简单地用 user.save 保存它?
  • 没错,mongoDB的东西是在你调用save()的时候在后台处理的,模型的实例会得到适当的处理。有很多保存方法,请查看doc,它很彻底。还可以查看Schema.Types.Mixed,它对所有人都是免费的!
  • 但是我该如何保存匿名函数的参数呢?
  • 不工作...我纠正了一些小错误,如缺少分号,但它不工作。出于某种原因,没有输入 if 语句来删除好友连接。你有这方面的线索吗?
  • 检查 req.params.friendID 是否如您所愿。
【解决方案2】:

如果你需要操作数组,你应该先将它们转换成对象。

User.findOne({_id: req.params.userid}, function (err, user) {
  if (err) {
      return (err, null);
  }

  var user = user.toObject();

  //... your code, an example =>
  delete user.friends;
  res.json(user);
});

问候,尼科尔斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 2011-10-13
    • 2022-09-23
    • 2017-05-14
    • 2011-09-22
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多