【问题标题】:Is it possible to get a slice of a slice in Mongo?有没有可能在Mongodb中得到一个切片?
【发布时间】:2015-01-23 18:01:13
【问题描述】:

我正在查询一个 mongo 集合,该集合的字段是数组的数组。我想从数组数组中找到一个具有一个深值投影的记录。从概念上讲,这是 $slice 的 $slice。有没有办法在 Mongo 中做到这一点?

例如-我有一个记录:

{
 name: "foo",
 text: [["part 1:1", "part 1:2"],["part 2:1","part 2:2"]] 
}

并且想要选择带有投影“part 2:2”的记录。

db.collection.find({"name":"foo"},{text: {$slice: [1,1]}} 

给了我“part 2:1”和“part 2:2”的数组。如何获得“第 2:2 部分”?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    如果您想要特定的 2:2 部分,下面的查询会有所帮助。

    db.user.find({"name":"foo"},{_id:0,name:0})[0].text[1][1];

    第 2:2 部分

    【讨论】:

      【解决方案2】:

      您需要使用聚合管道来实现$slice 链,因为项目语句作为查找查询的一部分存在限制。

      以下查询无效,因为第一个 $slice 将返回一个数组,而不是一个索引,并且外部作用域 $slice 的执行失败。

      db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
      

      此外,无法处理同一项目声明中的投影字段,如果可能,我们可以通过对其应用 $slice 来进一步修改文本。

      要走的路是:

      • Match 名为 foo 的记录。
      • Unwind 到达第一层的文本数组。
      • Unwind 再次达到我们想要的水平。
      • Group 记录一起按名称。
      • Project 组中的最后一条记录,也是最后一个元素 最后一个嵌套数组。

      代码:

      db.collection.aggregate([
      {$match:{"name":"foo"}},
      {$unwind:"$text"},
      {$unwind:"$text"},
      {$group:{"_id":"$name","text":{$last:"$text"}}},
      {$project:{"name":"$_id","text":1}}
      ])
      

      或者,如果您想投影以特定顺序出现的元素,则可以使用 $skip$limit 操作来实现此目的。

      var orderOfElement = 2;
      db.collection.aggregate([
      {$match:{"name":"foo"}},
      {$unwind:"$text"},
      {$unwind:"$text"},
      {$skip:orderOfElement -1},
      {$limit:1}
      ])
      

      在嵌套数组中按顺序投影第二个元素。

      【讨论】:

      • 有趣!我们也可以用 MapReduce 来做吗?
      • 是的,但是 Map reduce 用于更复杂的操作,受聚合框架的限制。
      • 有没有一种方法可以处理多个文档?
      猜你喜欢
      • 2018-10-09
      • 2018-08-25
      • 2017-05-03
      • 2018-01-13
      • 1970-01-01
      • 2017-03-16
      • 2011-05-02
      • 2014-10-20
      • 1970-01-01
      相关资源
      最近更新 更多