Javascript 使用mongoose更新MongoDB中数组内的对象

Javascript 使用mongoose更新MongoDB中数组内的对象,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在尝试更新文档中数组中的对象。这些对象不是子文档,因此没有唯一的ID。我尝试了各种方法来实现这一点,但似乎没有任何效果(例如,什么都没有发生-没有错误,但是文档没有更新) 仅显示代码可能更容易。首先,以下是此集合中的文档示例: { _id: 123, //other fields go here submissions: [ { submission: 1, downloaded: null, //Thi

我正在尝试更新文档中数组中的对象。这些对象不是子文档,因此没有唯一的ID。我尝试了各种方法来实现这一点,但似乎没有任何效果(例如,什么都没有发生-没有错误,但是文档没有更新)

仅显示代码可能更容易。首先,以下是此集合中的文档示例:

{
    _id: 123,
    //other fields go here
    submissions: [
        {
            submission: 1,
            downloaded: null, //This should be an ISODate when populated
            assessor: null,   //This should be an ObjectID when populated
            feedbackUploaded: null, //This should also be an ISODate
            path: '401Test1.doc',
            assessorNotes: null //This should be a string when populated
        },
        {
            submission: 2,
            downloaded: null,
            assessor: null,
            feedbackUploaded: null,
            path: '401Test2.doc',
            assessorNotes: null
        }
    ]
}
现在我的猫鼬查询(在快速路线内):

我还尝试过在
$set
命令中使用
$
符号,即
'submissions.$.assessorNotes':req.body.assessorComments'
,但这似乎也不起作用

我哪里出错了

干杯


Chris刚刚用上面TomG在shell中提到的位置操作符测试了这一点

> db.foo.find().pretty()
{
    "_id" : 123,
    "submissions" : [
        {
            "submission" : 1,
            "downloaded" : null,
            "assessor" : null,
            "feedbackUploaded" : null,
            "path" : "401Test1.doc",
            "assessorNotes" : null
        },
        {
            "submission" : 2,
            "downloaded" : null,
            "assessor" : null,
            "feedbackUploaded" : null,
            "path" : "401Test2.doc",
            "assessorNotes" : null
        }
    ]
}
然后我运行了update命令:

db.foo.update(
  { _id: 123, "submissions.submission": 2 }, 
  { $set: {
    "submissions.$.assessorNotes": "testAssessorNotes",
    "submissions.$.feedbackUploaded": new Date(),
    "submissions.$.assessor": "testAssessor"
  } }
)
结果如下:

{
    "_id" : 123,
    "submissions" : [
        {
            "submission" : 1,
            "downloaded" : null,
            "assessor" : null,
            "feedbackUploaded" : null,
            "path" : "401Test1.doc",
            "assessorNotes" : null
        },
        {
            "submission" : 2,
            "downloaded" : null,
            "assessor" : "testAssessor",
            "feedbackUploaded" : ISODate("2016-10-26T15:33:09.573Z"),
            "path" : "401Test2.doc",
            "assessorNotes" : "testAssessorNotes"
        }
    ]
}
编辑:我的直觉是,错误也可能发生在Mongoose中的更新中,您可以尝试将两者都更改为位置运算符,以及使用if-if-fitness代替update

请尝试此Mongoose查询:

Unit.update(
    { "_id": unit, "submissions.submission": submission }, 
    { $set: {
        'submissions.$.assessorNotes': req.body.assessorComments,
        'submissions.$.feedbackUploaded': date,
        'submissions.$.assessor': req.body.assessor
    } }, function(err, result) {
        //callback
    }
});

刚才通过shell中的TomG使用上面提到的位置操作符测试了这一点

> db.foo.find().pretty()
{
    "_id" : 123,
    "submissions" : [
        {
            "submission" : 1,
            "downloaded" : null,
            "assessor" : null,
            "feedbackUploaded" : null,
            "path" : "401Test1.doc",
            "assessorNotes" : null
        },
        {
            "submission" : 2,
            "downloaded" : null,
            "assessor" : null,
            "feedbackUploaded" : null,
            "path" : "401Test2.doc",
            "assessorNotes" : null
        }
    ]
}
然后我运行了update命令:

db.foo.update(
  { _id: 123, "submissions.submission": 2 }, 
  { $set: {
    "submissions.$.assessorNotes": "testAssessorNotes",
    "submissions.$.feedbackUploaded": new Date(),
    "submissions.$.assessor": "testAssessor"
  } }
)
结果如下:

{
    "_id" : 123,
    "submissions" : [
        {
            "submission" : 1,
            "downloaded" : null,
            "assessor" : null,
            "feedbackUploaded" : null,
            "path" : "401Test1.doc",
            "assessorNotes" : null
        },
        {
            "submission" : 2,
            "downloaded" : null,
            "assessor" : "testAssessor",
            "feedbackUploaded" : ISODate("2016-10-26T15:33:09.573Z"),
            "path" : "401Test2.doc",
            "assessorNotes" : "testAssessorNotes"
        }
    ]
}
编辑:我的直觉是,错误也可能发生在Mongoose中的更新中,您可以尝试将两者都更改为位置运算符,以及使用if-if-fitness代替update

请尝试此Mongoose查询:

Unit.update(
    { "_id": unit, "submissions.submission": submission }, 
    { $set: {
        'submissions.$.assessorNotes': req.body.assessorComments,
        'submissions.$.feedbackUploaded': date,
        'submissions.$.assessor': req.body.assessor
    } }, function(err, result) {
        //callback
    }
});

它应该与位置运算符
$
配合使用。您确定有匹配项吗?如果您只是使用这些参数
find
,您找到文档了吗?尝试运行
find
,它返回了正确的文档,因此看起来我正在获得匹配项-它只是没有更新。是否已尝试使用
findOneAndUpdate
也是-同样的问题它应该与位置运算符
$
一起工作。你确定你有匹配项吗?如果你只是用这些参数
查找
,你找到文档了吗?尝试运行
查找
,它返回了正确的文档,因此看起来好像我得到了匹配项-它只是没有更新。你尝试过吗h
findOneAndUpdate
也一样-同样的问题刚刚尝试了
findOneAndUpdate
,似乎也有同样的问题。当我按照Tom的建议进行
find
时,它会返回正确的文档,因此看起来好像我有匹配的文档。除了
更新
findOneAndUpdate
之外,还有其他选择吗?可能是用在g
save
或类似的东西?您可以使用find/findOne在回调中返回您的对象,然后修改值并最终调用save函数。您是否也在$set中使用位置运算符?我为Mongoose添加了一个查询,请尝试一下,看看它是否有效?我注意到在集合c的末尾缺少一个大括号Omand.OK,我已经设法解决了它-我将很快添加解决方案,但基本上它涉及对文档执行
findById
,然后在提交数组中循环,在
submission
上查找匹配项,然后使用
save
-与您的建议非常相似。
update
不起作用首先-这是猫鼬的常见错误吗?当然,它可以用于迭代和保存,但也可以用于
update
findOneAndUpdate
findByIdAndUpdate
。你确定你的
req.body
参数没有问题吗?有没有错误?只是尝试了
findOneAndUpdate
似乎也有同样的问题。当我按照Tom的建议进行
查找时,它会返回正确的文档,因此看起来好像我有匹配项。除了
更新
findOneAndUpdate
之外,还有其他选择吗?也许可以使用
保存
或类似的方法?您可以使用find/findOne在ca中返回您的对象llback,然后修改值,最后调用save函数。您是否也在$set中使用位置运算符?我为Mongoose添加了一个查询,您能试试看它是否有效吗?我注意到set命令末尾缺少一个大括号。好的,我已设法解决了它-我将很快添加解决方案,但基本上它涉及g在文档上查找一个
findById
,然后在提交数组中循环,在
submission
上查找匹配项,然后使用
save
——这与您的建议非常相似。非常奇怪的是
update
一开始就不起作用——这是mongoose的常见错误吗?当然,它可以用于迭代和save,但它也应该与
update
findOneAndUpdate
findbyiandupdate
一起使用。您确定您的
req.body
参数正常吗?是否有任何错误?