Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose/MongoDB更新不工作_Node.js_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

Node.js Mongoose/MongoDB更新不工作

Node.js Mongoose/MongoDB更新不工作,node.js,mongodb,mongoose,mongodb-query,Node.js,Mongodb,Mongoose,Mongodb Query,我知道这个问题在这里被打得要死,但我已经尝试了一切,无法解决这个问题。它快把我逼疯了 我有一个这样的模型: customer { email: String, password: String, addresses: [addresses_schema] } 1️⃣ { __v: 0, email: 'example@example.com', _id: 55ecf31a53558e183d208aa2, addresses: [ { name: 'One', _id:

我知道这个问题在这里被打得要死,但我已经尝试了一切,无法解决这个问题。它快把我逼疯了

我有一个这样的模型:

customer {
 email: String,
 password: String,
 addresses: [addresses_schema]
}
1️⃣ { __v: 0,
  email: 'example@example.com',
  _id: 55ecf31a53558e183d208aa2,
  addresses:
   [ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
     { name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: false } ] }
2️⃣ { _id: 55ecf31a53558e183d208aa2,
  email: 'example@example.com',
  __v: 0,
  addresses:
   [ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
     { name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: true } ] }
Mongoose: users.remove({}) {}
Mongoose: users.insert({ email: 'example@example.com', _id: ObjectId("55ecf35627cddb243d3d8e22"), addresses: [ { name: 'One', _id: ObjectId("55ecf35627cddb243d3d8e24"), primary: false }, { name: 'Two', _id: ObjectId("55ecf35627cddb243d3d8e23"), primary: false } ], __v: 0 })
Mongoose: users.findAndModify({ 'addresses._id': ObjectId("55ecf35627cddb243d3d8e23"), email: 'example@example.com' }) [] { '$set': { 'addresses.$.primary': true } } { new: true, upsert: false, remove: false }
地址和模式如下所示

address {
 addr1: String,
 ... Other address fields
 primary_address: Boolean
}
现在,我想更新一个用户的特定地址记录,使其主地址为true

因此,我:

var modifyUser = function(address_id){
  User.findOne( { email: email } ).then(function(user){
    user.update({ 'addresses._id': address_id }, 
                { $set: { 'addresses.$.primary_address': 'true' } } )

       .then(function(){
         console.log('Should eventually reach here');
        }).catch (err) {
           console.log('err:', err.message);
         });


    user.save();
  });
}
但是,如果在更新前后获取user.addresses,则不会发生任何更改。相反,它给了我一个错误:

cannot use the part (addresses of addresses._id) to traverse the element ({addresses[ {addr1: '123 test street', addr2: '', city: 'test city' ... ]}

有人能帮我吗?我会非常感激的。谢谢大家!

我不知道你是否真的必须使用猫鼬,从你的问题中看不出这是否是一个要求

以下是直行Monogodb驱动程序的示例:

var MongoClient = require('mongodb').MongoClient
  , format = require('util').format;

MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
if(err) throw err;

db.collection('test').findAndModify(
  {hello: 'world'}, // query
  [['_id','asc']],  // sort order
  {$set: {hi: 'there'}}, // replacement,     replaces only the field "hi"
  {}, // options
  function(err, object) {
      if (err){
          console.warn(err.message);  //     returns error if no matching object found
      }else{
          console.dir(object);
      }
  });
});

我在这里的钱是因为您正在查找的“address_id”值实际上与任何内容都不匹配。对检索的文档执行
.update()
通常不是您想要的,这会混淆代码中的问题

而是执行一个初始操作,通过匹配的“email”和“addresses.\u id”值检索,如本完整示例所示:

const mongoose = require('mongoose')
const Schema = mongoose.Schema;

var addressSchema = new Schema({
  name: String,
  primary: { type: Boolean, default: false }
});
var userSchema = new Schema({
  email: String,
  addresses: [addressSchema]
});
var User = mongoose.model('User',userSchema);

mongoose.connect('mongodb://localhost/utest');
mongoose.set("debug",true);

await User.remove();

let user = await User.create({
  email: "example@example.com",
  addresses: [
    { "name": "One" },
    { "name": "Two" }
  ]
});
console.log("1️⃣", user);

user = User.findOneAndUpdate(
  {
    "email": user.email,
    "addresses._id": user.addresses[1]._id
  },
  {
    "$set": { "addresses.$.primary": true }
  },
  { "new": true }
)
console.log("2️⃣", user);

mongoose.disconnect();
这将持续产生如下输出:

customer {
 email: String,
 password: String,
 addresses: [addresses_schema]
}
1️⃣ { __v: 0,
  email: 'example@example.com',
  _id: 55ecf31a53558e183d208aa2,
  addresses:
   [ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
     { name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: false } ] }
2️⃣ { _id: 55ecf31a53558e183d208aa2,
  email: 'example@example.com',
  __v: 0,
  addresses:
   [ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
     { name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: true } ] }
Mongoose: users.remove({}) {}
Mongoose: users.insert({ email: 'example@example.com', _id: ObjectId("55ecf35627cddb243d3d8e22"), addresses: [ { name: 'One', _id: ObjectId("55ecf35627cddb243d3d8e24"), primary: false }, { name: 'Two', _id: ObjectId("55ecf35627cddb243d3d8e23"), primary: false } ], __v: 0 })
Mongoose: users.findAndModify({ 'addresses._id': ObjectId("55ecf35627cddb243d3d8e23"), email: 'example@example.com' }) [] { '$set': { 'addresses.$.primary': true } } { new: true, upsert: false, remove: false }
并有如下调试输出:

customer {
 email: String,
 password: String,
 addresses: [addresses_schema]
}
1️⃣ { __v: 0,
  email: 'example@example.com',
  _id: 55ecf31a53558e183d208aa2,
  addresses:
   [ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
     { name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: false } ] }
2️⃣ { _id: 55ecf31a53558e183d208aa2,
  email: 'example@example.com',
  __v: 0,
  addresses:
   [ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
     { name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: true } ] }
Mongoose: users.remove({}) {}
Mongoose: users.insert({ email: 'example@example.com', _id: ObjectId("55ecf35627cddb243d3d8e22"), addresses: [ { name: 'One', _id: ObjectId("55ecf35627cddb243d3d8e24"), primary: false }, { name: 'Two', _id: ObjectId("55ecf35627cddb243d3d8e23"), primary: false } ], __v: 0 })
Mongoose: users.findAndModify({ 'addresses._id': ObjectId("55ecf35627cddb243d3d8e23"), email: 'example@example.com' }) [] { '$set': { 'addresses.$.primary': true } } { new: true, upsert: false, remove: false }
这只是设置示例,但主要的事情发生在
.findOneAndUpdate()
中,在承诺的解析中,您会看到返回的文档在指定的数组元素处从原始表单“更新”


这是您在这里基本上应该做的,对返回文档的任何进一步修改都是在“更新和获取”完成之后进行的。

我在这里没有看到任何回调。你想直接从函数调用返回这个吗?@BlakesSeven下面有300行代码,我不想复制粘贴到这里。我不想返回它,我只是想更新我找到的用户。我已经更新了我的问题。显示一个处理
.update()
然后查看数据的“最小示例”。不管怎样,你可能真的想要。但我的主要观点是,这里的
.update()
没有承诺或回调,所以至少在您查看数据时,它可能还没有“启动”。您需要显示的不仅仅是“在此之后显示更多代码”。显示实际发生的情况(在breif中),但主要操作。@BlakesSeven,实际上,更新是代码的核心。将then调用附加到更新会提供更多信息。在我深入研究“最小案例”之后,我会在几分钟内再次更新。你应该花2分钟来写。创建文档,找到它,更新它,读回它。但是这里的代码甚至没有显示正在执行的更新。这就是我要你补充的
user.update()
不执行任何操作。它需要执行。同样,它应该是
User.update()
,并且很可能整个事情应该是
.findOneAnUpdate()
,如前所述。如果您有300行代码,然后调用
.save()
,那么这是不好的。