【问题标题】:MongoDB - Mongoose Array Pull from docMongoDB - 从文档中提取 Mongoose 数组
【发布时间】:2015-02-18 12:44:02
【问题描述】:

我对 mongoose 的 pull 方法有些困惑,你只能通过 objectID 进行拉取,还是只能通过数据模型中的值进行拉取?

无论哪种方式,我都无法从数组中删除元素。

以下是型号:

var fieldSchema = new Schema({
    'name' : String,
    'value' : String
});

var formSchema = new Schema({
    'name' : String,
    'fields' : [fieldSchema]
});

var userSchema = new Schema({
    'email' : String,
    'firstName' : String,
    'lastName' : String,
    'application' : [formSchema]
});

var fieldModel = mongoose.model('field',fieldSchema);
var formModel = mongoose.model('form',formSchema);
var userModel = mongoose.model('user',userSchema);

代码(数据库中只有一个文档,这就是 findOne 没有参数的原因):

userModel.findOne({}, function (err, user) {
  if (err) return handleError(err);

  var edit = false;

  for(i in user.application) {
    if(user.application[i].name == submit.name) {
      edit = true;

      user.application.pull({'name':submit.name}); //is this valid?
      user.application.push(submit);
    }
  }
  console.log(edit);
  if(!edit) {
    user.application.push(submit);
  }

  user.save(function(err, doc, numAffected) {
    if (err) console.log(err);
    else {
      console.log('number of rows: ' + numAffected);
      doc.save();
    }
  });

});

数据库中的文档:

"_id" : ObjectId("5490f0cdd059b4cdb6bdf7d2"),
"email":"test@test.com",
"firstName":"tester",
"lastName":"tester",
"application" : [
    {
        "name" : "Contact",
        "fields" : [
            {
                "field_name" : "New field - 1",
                "field_value" : "kkkkkkk"
            }
        ]
    }
],

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    用下面的代码更改你的第二个代码,你使用的 pull 是不允许的,因为 user.application 是 javascript 数组并且没有从数组中删除元素的 pull 方法。你可以在 mongoDB 查询中使用 $pull ,它不是在这种情况下建议使用for(i in user.application)

    userModel.update({'application.name':submit.name},{$push:{application:submit}},function (err, user) {
      if(user===0){
        userModel.update({},{$push:{application:submit}},function(){
    
        })
      }
    
    });
    

    【讨论】:

    • 为什么不建议在这种情况下使用 for 循环?
    • 因为您有数组 user.application 并使用 for 循环进行迭代,但同时您将对象推送到数组(user.application)中,因此它执行多个:使用此代码和记录循环执行的次数:var j=0; for(var i in user.application) { console.log(++j) if(user.application[i].name == submit.name) { edit = true; user.application.pull({'name':submit.name}); user.application.push(submit);//错误!!! } }
    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 2018-01-26
    • 2015-06-23
    • 2016-02-01
    • 2019-12-28
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多