1

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

如果我将 created 更改为 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) {

              });
4

2 回答 2

0

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

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

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

于 2013-11-01T19:46:11.813 回答
0

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

你的代码在做什么:

  1. 找到文件_id = user_id
  2. 在其键items中插入一堆对象(碰巧那一堆= 1)
  3. 然后按字段按降序对关键项进行排序created
  4. 只留下 5 个最小的元素。

问题出现是因为该Date()字段。日期一直在增加。所以每个新元素都不会出现在这 5 个最小的元素中。当您更改您时created : 1,您会按顺序进行排序,并且您的新日期肯定会出现在 5 个元素中。

关于这一点:

知道怎么做吗?谢谢!

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

于 2013-11-01T20:11:38.597 回答