Mongoosejs 更新子文档

Posted

技术标签:

【中文标题】Mongoosejs 更新子文档【英文标题】:Mongoosejs updating a subdocument 【发布时间】:2020-06-30 18:47:10 【问题描述】:

我正在尝试使用 $set 运算符推送子文档位置。我见过类似的 SO 线程 Mongoose find/update subdocument。我的模型如下所示。

const mongoose = require('mongoose');

const positionSchema = new mongoose.Schema(

    posA: 
        type: Number,
    ,

    posB: 
        type: Number,
    ,

    date: 
        type: Date,
        default: Date.now
    

,  _id: false );

const LocationSchema = new mongoose.Schema(

    position: [positionSchema],

    username: 
        type: String,
        required: true
    ,

,  versionKey: false );

const Location = mongoose.model('Location', LocationSchema);

module.exports = Location;

第一次在数据库中创建文档。


    "_id":"$oid":"5e737eb7f0bdd67cf7521f6b",
    "username":"username",
    "position":[
        "posA":"$numberInt":"123.855",
        "posB":"$numberInt":"45.8777",
        "date":"$date":"$numberLong":"1584627688055"
    ]

为了更新子文档,我使用了这个

const newPos =  posA: 76.66665, posB: 109.4455567 ;

Location.findOneAndUpdate(
     username: username,    // filter
    
        "$set": 
            "position.$": newPos      // the new position added to the array
        
    ,
    (err, result) => 
        if (err) throw err;
        console.log(result);
);

虽然,我收到一个错误并且子文档没有添加到数组中

MongoError: 位置运算符没有从查询中找到所需的匹配项。

有不同的方法吗?

【问题讨论】:

你有没有这样尝试过 "$set": "position": newPos // 添加到数组中的新位置 这样的? 并尝试使用 updateOne 代替 用户名在哪里声明? 用户名是从程序的其他部分给出的。我已经尝试过你上面说的解决方案。它更新了我的子文档,但我没有很好地解释。我需要在数组中推送一个新的子文档。我将编辑我的帖子 尝试使用 $push 而不是 $set 【参考方案1】:

为了将项目推送到数组,请尝试使用 $push 而不是 $set

【讨论】:

【参考方案2】:

只需在“位置”后去掉'.$',它应该可以工作。

MongoDb 找不到位置运算符的匹配项,因为您尚未在查询中定义它。

但在这种情况下您不需要使用位置运算符。

编辑:另外,如果您不想替换原始数组,请使用:$push 而不是 $set

【讨论】:

以上是关于Mongoosejs 更新子文档的主要内容,如果未能解决你的问题,请参考以下文章

MongooseJS - 限制子文档中的文档数量

mongoose

猫鼬引用子文档的不同方式?

未能成功更新 Mongoose 子文档

更新子文档、NodeJS 和 Mongoose 的更有效方式

更新子文档、NodeJS 和 Mongoose 的更有效方式