我想基于doc _id和element _id在数组中嵌入一个元素。目前它仅在元素已经在数组中时才起作用(更新工作,不插入)。
所以,这些集合:
[{
"_id": "5a65fcf363e2a32531ed9f9b",
"ressources": [
{
"_id": "5a65fd0363e2a32531ed9f9c"
}
]
}]
收到此请求:
query = { _id: '5a65fcf363e2a32531ed9f9b', 'ressources._id': '5a65fd0363e2a32531ed9f9c' };
update = { '$set': { 'ressources.$': { '_id': '5a65fd0363e2a32531ed9f9c', qt: '153', unit: 'kg' } } };
options = {upsert:true};
collection.update(query,update,options);
会给出这个好结果:
[{
"_id": "5a65fcf363e2a32531ed9f9b",
"ressources": [
{
"_id": "5a65fd0363e2a32531ed9f9c",
"qt": 153,
"unit": "kg"
}
]
}]
如何使用这些初始集合执行相同的请求:
[{
"_id": "5a65fcf363e2a32531ed9f9b"
}]
OR
[{
"_id": "5a65fcf363e2a32531ed9f9b",
"ressources": []
}]
如何使upsert工作? upsert是否仅适用于整个文档? 目前,我遇到了这个错误:
位置操作员未找到查询所需的匹配项。
由于
答案 0 :(得分:0)
我也试图弄清楚该怎么做。我发现只有一种方法:
遗憾地知道,在2018年你仍然必须做这样的东西吧。
更新:
这将更新viewData数组中的特定元素
db.collection.update({
"_id": args._id,
"viewData._id": widgetId
},
{
$set: {
"viewData.$.widgetData": widgetDoc.widgetData
}
})
$push
命令将添加新项目