有人能帮我找到这个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 ,
}
);