MongoDB使用sort和slice更新嵌套数组,不对desc进行排序

时间:2013-11-01 17:01:48

标签: javascript mongodb

我正在尝试将对象推送到嵌入式数组,并在切片为5时按desc排序。

如果我将创建更改为1,但它是'升序',则此方法有效。现在发生的是新对象,实际上并没有插入到数组中,如果它有5个。

知道怎么做吗?谢谢!

 db.user.update({_id : user_id},
                { "$push" : { items : { "$each" : [{
                                                          action : 'one',
                                                          status : 'two', 
                                                          value : 'three',
                                                          created: new Date()
                                                        }
                                                      ],
                                              "$sort" : {created: -1},
                                              "$slice" : -5
                                            }

                            }
                }
              , function(err, doc) {

              });

2 个答案:

答案 0 :(得分:0)

发生的事情是你要求MongoDB按降序排序项目,只保留最后5项;这意味着只保留5个最小的物品。但是,由于您按升序插入项目(因为Date()不断增加),一旦插入5个项目,您已经拥有5个最小的项目,因此不会插入后续项目。

如您所知,如果您将排序顺序更改为升序,那么您将保留5个最大的项目;因为每个新项目的Date()都比之前的所有项目都要大,所以每个新项目最初都会在最大的5个项目中,因此会出现在列表中。

如果您需要按降序排序的5个最大项目,您可以使用升序排序顺序,当您按$项目以使用$ slice保留最大5,然后当您查询数据时,您可以反转客户端的结果顺序。

答案 1 :(得分:0)

代码中的所有内容都按预期工作。因此,你实际上看不到任何结果。

您的代码正在做什么:

  1. 使用_id = user_id
  2. 查找文档
  3. 在其键items中插入一堆对象(它发生束= 1)
  4. 然后按字段created
  5. 按递减顺序对关键项进行排序
  6. 并且只留下5个最小的元素。
  7. 由于Date()字段而出现问题。日期一直在增加。因此,每个新元素都不会在这5个最小元素中结束。当您更改created : 1时,按升序排序,新日期肯定会以5个元素结束。

    关于这个:

      

    知道怎么做吗?谢谢!

    如果你想更好地描述你想要的东西,我希望我能告诉你你可以改变什么,因为现在你的脚本正在做正确的事情。如你所述,你可以放created : 1