MongoDB $set query in mongoose:更新嵌套文档数组中的对象



有人能帮我找到这个mongosh查询的猫鼬吗?

我有这个数据:

{ 
data: [ 
{
x: 1,
y: 1
},
{
x: 11,
y: 11
},
{
x: 111,
y: 111
} 
]
}

为了更新数组中的嵌套对象,我在Mongo SH中这样做,它可以工作:

*.updateOne({_id: 'ID_HERE', "data.x": 1}, {$set: {"data.$": { x: 2, y: 2 }} })

我如何在猫鼬中做到这一点?这是我运行它的方式

const result = await Positions.updateOne(
{ _id: collectionId, "data.x": 1 },
{
$set: {
"data.$": { x: 2, y: 2 },
},
}
);

*.updateOne的响应:

{
"acknowledged": false
}

*的响应。findOneAndUpdate只是返回未修改的相同数据

虽然更新没有发生。使用mongoose v6.0.6

我认为问题是与$位置选择器。如果我更改$set以更新"数据";直接代替"data.$"它可以工作,但当然,这不是我想要的,因为它替换了整个数据数组。

编辑:多亏了乔的回答,我才找到了问题所在。问题其实出在图式上。Data被设置为一个对象而不是一个对象数组所以我将Schema从data: {x: Number, y: Number}更新为data:[{x: Number, y: Number}]

这不是一个完整的解决方案,但它确实提供了一些相关的数据,将有助于找到一个。

我对你给的代码做了一个快速测试:

const mongoose = require("mongoose");
async function main() {
await mongoose.connect("mongodb://localhost:27017/");
const Arrtest = mongoose.model("arrtest",new mongoose.Schema({data:[{}]}));
const newdoc = await Arrtest.create({ 
data: [ 
{
x: 1,
y: 1
},
{
x: 11,
y: 11
},
{
x: 111,
y: 111
} 
]
});
console.log("Mongoose version:", mongoose.version);
console.log("before:",await Arrtest.findOne({_id:newdoc._id}));
const result = await Arrtest.updateOne(
{"_id":newdoc._id, "data.x":1},
{$set:{
"data.$":{x:2,y:2}
}}
);
console.log("result:",result); 
console.log("after:",await Arrtest.findOne({_id:newdoc._id}));
process.exit(0);
}
main();

运行的结果是:

Mongoose version: 6.0.8
before: {
_id: new ObjectId("615a995ea3ae207cde4c6984"),
data: [ { x: 1, y: 1 }, { x: 11, y: 11 }, { x: 111, y: 111 } ],
__v: 0
}
result: {
acknowledged: true,
modifiedCount: 1,
upsertedId: null,
upsertedCount: 0,
matchedCount: 1
}
after: {
_id: new ObjectId("615a995ea3ae207cde4c6984"),
data: [ { x: 2, y: 2 }, { x: 11, y: 11 }, { x: 111, y: 111 } ],
__v: 0
}

这似乎正是您想要的,所以问题似乎不在更新表达式中。

也许有一个验证问题,或者与Positions模型或模式不匹配的东西?

你可以试试:

await Positions.updateOne(
{ _id: collectionId, "data.x": 1 },
{
"data.$.x":2 ,
"data.$.y":2 ,
}
);

最新更新