插入到MongoDB文档数组的前面,没有$position和$each

Insert into the front of a MongoDB document array without $position and $each?

本文关键字:没有 position each 前面 MongoDB 文档 数组 插入      更新时间:2023-09-26

当将流星应用程序部署到未更新到Mongo 3.0的沙盒MongoDB时,我不能使用$position$each查询。

有没有其他方法可以实现我对这些查询的处理?

我想在数组的前面添加一个任务。

以下是方法中的代码:

newTask: function(task, date, number) {
    if (! Meteor.userId()) {
        throw new Meteor.Error("not-authorized");
    }
    if(number === 0){
        projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.0.tasks': { $each: [{name: task, date: date}], $position: 0}}})
    } else if(number === 1){
        projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.1.tasks': { $each: [{name: task, date: date}], $position: 0}}})
    } else if(number === 2){
        projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.2.tasks': { $each: [{name: task, date: date}], $position: 0}}})
    } else if(number === 3){
        projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.3.tasks': { $each: [{name: task, date: date}], $position: 0}}})
    }
}

但本质上,我该如何重建

projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.3.tasks': { $each: [{name: task, date: date}], $position: 0}}})

不使用CCD_ 3和CCD_?

我真的觉得这很简单,并发表了评论,但后来想了想,这真的是一个答案。

这取决于哪种情况真正适合,但这里有两种替代方案。

  1. 只需使用标准$push操作继续向数组中添加项即可。无论如何,这只是"附加"(而不是预挂起(到数组中。

    projectsDB.update(
        { user: Meteor.user()._id }, 
        { $push: {
            'panels.0.tasks': { name: task, date: date }
        }}
    )
    

    因此,不用担心那里支持的修饰符,因为所有新条目都只是放在后面而不是前面。

    但是,当您读回数据时,所需要做的就是将JavaScript.reverse()应用于数组。构造很简单,只需将其放在助手中或根据需要"发布":

    var projects = projectsDB.find(query).fetch();
    projects.forEach(function(project) {
        project.panels.forEach(function(panel) {
            panel.tasks.reverse();   // reverses the order
        });
    })
    

    您只需要注意是否像这样"发布",以便在附加任何其他内容之前再次预处理.reverse()。所以可能更适合只作为显示助手。

  2. 由于我在其中看到了一个"日期",所以您希望"最新任务"列在第一个似乎是合乎逻辑的。因此,您在这里真正需要做的就是应用已经支持的$sort修饰符:

    projectsDB.update(
        { user: Meteor.user()._id }, 
        { $push: 
            { 'panels.0.tasks': { 
                $each: [{name: task, date: date}], 
                $sort: { date: -1 }
            }}
        }
    )
    

    然后,"最新"条目将始终位于"最前面",因为列表在每次更新时都按日期属性"排序"。不确定您的流星版本或MongoDB版本是否支持不带$slice修饰符的$sort。如果需要,只需将其设置为所需的最大大小或大于最大预期条目的数字,这样在后一种情况下就不会产生影响。

$position修饰符本身的用途比简单地"预挂起"数组要广泛得多,因此在引入之前,总是有其他方法可以实现同样的目的。

截至本文撰写之时,我相信这还没有成为"minimongo",因此无论服务器版本如何,任何客户端代码都无法使用运算符。但以上两种选择肯定会对客户有利。

根据您过去的问题编辑,这是服务器提示的内容:MongoError: $each term takes only $slice (and optionally $sort) as complements

删除$position,因为它只在MongoDB 2.6中引入,并尝试使用负索引进行破解:

{
  $set: {
     'panels.0.tasks.-1': {name: task, date: date}
  }
}