插入到MongoDB文档数组的前面,没有$position和$each
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}}})
不使用CCD_ 3和CCD_?
我真的觉得这很简单,并发表了评论,但后来想了想,这真的是一个答案。
这取决于哪种情况真正适合,但这里有两种替代方案。
-
只需使用标准
$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()
。所以可能更适合只作为显示助手。 -
由于我在其中看到了一个"日期",所以您希望"最新任务"列在第一个似乎是合乎逻辑的。因此,您在这里真正需要做的就是应用已经支持的
$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}
}
}
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 我的jQuery插件参数没有正确启动,遇到了问题
- 视频HTML没有'无法在Internet Explorer 11上工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- document.open/document.write没有正确地清除chrome中的文档——这是chrome的错误吗
- angular.js没有'无法在PhoneGap中处理视图标记
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- JavaScript中的函数和对象之间没有区别吗?
- JSON.parse没有'不能使用Javascript
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- Chrome扩展没有't在重新加载之前考虑期权价值
- 我的AngularJS表达式没有'不起作用
- 有没有一个javascript图形绘制库可以进行气球树布局
- .position()没有't指向容器
- 插入到MongoDB文档数组的前面,没有$position和$each
- .style("background-position", function(){…})没有填充属性