使用node.js中带有mongoose的条件更新数组

时间:2016-01-26 18:11:43

标签: javascript node.js mongodb mongoose

我正在尝试更新已创建使用Mongoose的架构的MongoDB集合。我的目标是删除名为“警报”的数组中的所有元素。小于(过去)当前时间。

这是我的Mongoose Schema:

var mongoose = require('mongoose');

var ReminderSchema = new mongoose.Schema({
    firstName: String,
    lastName: String,
    phone: Number,
    email: String,
    medication: String,
    alarms: [Date]
});

module.exports = mongoose.model('Reminder', ReminderSchema); 

这是更新。我试图删除所有小于当前日期的警报。

var date = new Date();
var Reminder = require('./models/Reminders.js');

//remove ALL alarms that are are before current time
Reminder.update({alarms: {$lte: date}}, {$pullAll: {alarms: {$lte: date}}}, function(err, updated){
    if(err){
         console.log(err);
     }
     else {
         console.log(updated);
     }
 });

我目前收到此错误:

{ [MongoError: $pullAll requires an array argument but was given a Object]
name: 'MongoError',
message: '$pullAll requires an array argument but was given a Object',
driver: true,
index: 0,
code: 2,
errmsg: '$pullAll requires an array argument but was given a Object' }

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

$pullAll接收的数组不是对象:

{ $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }
     

$ pullAll运算符删除指定值的所有实例   从现有的数组。与删除的$ pull运算符不同   通过指定查询元素,$ pullAll删除匹配的元素   列出的价值观。

你应该使用的解决方案 $ pull

Reminder.update({alarms: {$lte: date}},{$pull:{alarms: { $lte : new Date()}}}, 
 function(err, updated){
if(err){
     console.log(err);
 }
 else {
     console.log(updated);
 }
});

https://docs.mongodb.org/manual/reference/operator/update/pullAll/