我查询的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"?
答案 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