Mongoose更新返回undefined

时间:2017-11-10 09:02:09

标签: node.js mongodb mongoose

如何使用最初设置为空对象的新属性更新字段?

例如,我有以下架构:

import mongoose from 'mongoose';

var RunSchema = mongoose.Schema(
  {
    runId: { type: String },
    reports: {
      cookieSummary: {
        name: String,
        path: String
      }
    }
  }
)

export default mongoose.model('Run', RunSchema);

我正在尝试更新以下文档:

{
    "_id": {
        "$oid": "5a0565c2537e0b5d9d08ee6b"
    },
    "__v": 0,
    "reports": {},
    "runId": "8r4LNN3fRqd3qNgdW"
}

但是当我运行此代码时,它会返回undefined

  Run.findOneAndUpdate({runId: '8r4LNN3fRqd3qNgdW'}, 
  {
    $set: {'reports.cookieSummary': { 'name': 'test' }},
  }, (err, doc) => { console.log(doc) })

object标记添加到字段后,type符号有效:name: { type: String }

4 个答案:

答案 0 :(得分:1)

尝试使用 点符号 ,因为您只设置了一个字段:

  Run.findOneAndUpdate(
   { runId: '8r4LNN3fRqd3qNgdW' }, 
   { $set: {'reports.cookieSummary.name': 'test' } },
   (err, doc) => { console.log(doc) })

According to the docs,您正在使用的命令应该可以正常工作,但您写得错误。试试这样:

 Run.findOneAndUpdate(
  { runId: '8r4LNN3fRqd3qNgdW' }, 
  { $set: { 'reports.cookieSummary': {'name': 'test'} } },
  (err, doc) => { console.log(doc) })

如果它不起作用,也许当您使用这样的命令时,mongo期望该对象与其模式匹配。但我不这么认为。

让我知道。

答案 1 :(得分:0)

您对更新文档的查询是好的,只有错误是在$ set的大括号末尾。在这种情况下,您在最后实际创建问题时输入了不必要的逗号。所以我建议你删除它并运行它:

Run.findOneAndUpdate({runId: '8r4LNN3fRqd3qNgdW'}, 
{
$set: {'reports.cookieSummary': { 'name': 'test' }}
}, (err, doc) => { console.log(doc) });

然后看。你的其他查询很好。

希望它对你有用。 感谢。

答案 2 :(得分:0)

尝试使用以下代码,它将更新文档并返回更新的文档。

var Q = require('q');

var deferred = Q.defer();
Run.findOneAndUpdate({ runId: '8r4LNN3fRqd3qNgdW' }, { $set: { 'reports.cookieSummary.name': 'test' } }, { new: true },
    (err, doc) => {
        console.log(doc);
        deferred.resolve(doc);
    });
return deferred.promise;

答案 3 :(得分:0)

我做了一个小改动。测试这个解决方案。

    Run.findOneAndUpdate({runId: '8r4LNN3fRqd3qNgdW'}, 
    {
        $set: {"reports": {'cookieSummary':{'name': 'test'}}},
    }, (err, doc) => { console.log(doc) })