繁体   English   中英

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

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

当将流星应用程序部署到未更新到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}}})

不使用$position$each

我实际上以为这真的很简单,并发表了评论,但后来想到了,这确实是一个答案。

这取决于实际适合的情况,但是这里有两种选择。

  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 } }} } ) 

    然后,“最新”条目将始终位于“最前面”,因为列表在每次更新时都按date属性进行“排序”。 不知道您的流星版本还是MongoDB版本是否支持$sort而没有$slice修饰符。 如果需要,可以将其设置为所需的最大大小,或者将其设置为大于最大预期条目的数字,这样在后一种情况下不会起作用。

$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}
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM