我知道我不能同时使用upsert和位置运算符,但是如果我插入的对象的某些字段与数组中现有对象中的某些字段不匹配,我正在寻找附加到数组。 / p>
所以,如果我有下面的现有文档,我想检查'field'字段的值,如果字段匹配则更新/替换该子文档,如果不匹配则简单地附加到数组。
{
myArray:[
{
field:'xyz'
}
]
}
在node.js中有一个很好的方法吗?我正在使用本机驱动程序。
答案 0 :(得分:5)
我认为你不能在一个查询中做到这一点。您可以在本机驱动程序中使用两个单独的查询执行此操作。第一个查询将尝试更新数组中的字段。如果它没有在匹配的数组中找到该文档,则会调度第二个查询以将该文档附加到该数组。
db.collection('coll').update({_id: _id, "myArray": {field: "xyz"}}, {"$set": {"myArray.$": {field: "xyzt"}}}, {upsert: true}, function(err, res) {
if (err && err.code == 16836) { // no document was matched
db.collection('coll').update({_id: _id}, {"$push": {myArray: {field: "xyzt"}}}, function(err, res) {
console.log("Inserted document in array");
});
}
console.log("Updated document in array");
});