如何使用最初设置为空对象的新属性更新字段?
例如,我有以下架构:
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 }
答案 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) })