【问题标题】:mongodb Error mongoose do not push object in array $pushAllmongodb 错误 mongoose 不会在数组 $pushAll 中推送对象
【发布时间】:2018-06-17 23:26:10
【问题描述】:

我有一个带有 User 和 Post 模型的简单应用,

var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/assoc", {useMongoClient:true});
mongoose.Promise = global.Promise;

//Post
var postSchema = new mongoose.Schema({
    title: String,
    content: String
});
var Post = mongoose.model("Post", postSchema);

//User
var userSchema = new mongoose.Schema({
    email: String,
    name: String,
    posts: [postSchema]
});

var User = mongoose.model("User", userSchema);

我之前创建了一个用户(名称:“gino”)并将帖子推送到:

// var newUser = new User({
//     email: "a.b@c.it",
//     name: "gino"
// });
//
// newUser.posts.push({
//     title: "gino's post",
//     content: "this is content"
// });
//
// newUser.save(function (err, user) {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log(user);
//     }
// });

另外创建一个帖子来检查帖子模型是否有效:

// var newPost = new Post({
//     title: "honky",
//     content: "tonky"
// });
//
// newPost.save(function (err, post) {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log(post);
//     }
// });

当我尝试查找“gino”并将新项目推送到帖子数组时,尝试使用此 sn-p 保存用户 (user.save) 时出错:

User.findOne({name: "gino"}, function (err, user) {
    if (err) {
        console.log(err);
    } else {
        console.log(user);
        user.posts.push({
            title: "post",
            content: "content"
        });
        user.save(function (err, user) {
            if (err) {
                console.log(err);
            } else {
                console.log(user);
            }
        });
    }
});

当我运行应用程序时,我得到了这个:

{ MongoError: Unknown modifier: $pushAll
    at Function.MongoError.create (appFolder\node_modules\mongodb-core\lib\error.js:31:11)
    at toError (appFolder\node_modules\mongodb\lib\utils.js:139:22)
    at appFolder\node_modules\mongodb\lib\collection.js:1059:67
    at appFolder\node_modules\mongodb-core\lib\connection\pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)
  name: 'MongoError',
  message: 'Unknown modifier: $pushAll',
  driver: true,
  index: 0,
  code: 9,
  errmsg: 'Unknown modifier: $pushAll' }

有人可以帮助我吗?

【问题讨论】:

    标签: javascript arrays mongodb mongoose push


    【解决方案1】:

    尝试改用findOneAndUpdate

    User.findOneAndUpdate(
      { name: "gino" },
      { $push: { posts: { title: 'post', content: 'content' } } },
      { new: true },
      function (err, user) {
        if(err) console.log("Something wrong when updating data"); 
        console.log(user);  
    });
    

    希望对你有帮助!

    【讨论】:

    • 它有效,谢谢。但是,我想知道 .push 在我的代码中不起作用。
    • 您可以使用传统的 JavaScript 点符号来更新 mongoose 中的文档。但是,由于您没有在代码中使用返回的文档,因此findOneAndUpdate 是这里更合适的方式。你可以在官方文档mongoose阅读更多关于更新文档的内容:mongoosejs.com/docs/documents
    【解决方案2】:

    如果您使用的是 3.5 版或更高版本的 MongoDB,则可能是 $pushAll 的问题,它已被弃用。 我创建了一个选项来解决将 usePushEach 设置为 true 的问题:

    new Schema({ arr: [String] }, { usePushEach: true });
    

    成立于:

    https://github.com/Automattic/mongoose/issues/5574#issuecomment-332290518

    与 .push 一起使用会很有用。

    【讨论】:

    • 谢谢,我使用的是 mongo 3.6.1,这解决了我使用旧版本代码的问题。
    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2014-01-17
    • 2019-04-08
    • 1970-01-01
    • 2021-05-30
    相关资源
    最近更新 更多