是否有可能在Mongodb中获得切片?

时间:2014-11-25 16:19:47

标签: mongodb

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

例如 - 我有一条记录:

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

并希望选择带投影的记录"第2部分:2"。

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

给了我两个"第2部分:1"和"第2部分:2"。我如何得到"第2部分:2"?

2 个答案:

答案 0 :(得分:4)

由于项目语句中的限制是查询查询的一部分,您需要使用聚合管道来实现$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}
])

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

答案 1 :(得分:0)

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

  

db.user.find({"名称":"富"},{_ ID:0,名称:0})[0]的.text [1] [1] ;

     

第2部分:2