MongoDB聚合:无需第一个元素即可投射数组

5
{
    "_id" : ObjectId("5e3179e83708dc0dcfefaf"),

    "CaseNumber" : "T978045628",

    "ServiceReferences" : [ 

        ObjectId("5e317d48bc13eaf17712a786"),

        ObjectId("5e317f0ec08d57f4a88c3444"),

        ObjectId("5e317f0ec08d57f4a88c3234")

    ]

}

我有一个包含以上字段的集合。我想投影 'ServiceReferences' 数组,除第一个元素外,因为我想跳过该数组的第一个索引元素。请帮助我。我已经尝试了一些用例,例如:

db.getCollection('cases').aggregate([{
             "$project": {

                  "ServRefs": { $pop: { ServiceReferences: -1 } }
              }
       },
       {
        $lookup: {

            from: 'services',

            localField: 'ServRefs',

            foreignField: '_id',

            as: 'serviceDoc'

        }
    }, { $unwind: '$serviceDoc' }])

请问您能否举个预期结果的例子? - Ashwanth Madhav
3个回答

5

试试这个

db.getCollection('cases').aggregate([
{ $project: { ServiceReferences: 1, SerRef: { $slice: [ "$ServiceReferences", 1, {$subtract: [ {$size:"$ServiceReferences"}, 1 ]} ] }} }
])

1
谢谢。它正常工作了...首先我检查了长度的存在,然后它就起作用了 :: { "$match": { "ServicesReferences.1":{$exists:true}} },否则它会抛出异常 :: errmsg" : "第三个参数$ slice必须是正数:0 - Swapna
好的。最好检查存在性。 - Ashwanth Madhav

0
使用切片

https://www.mongodb.com/docs/manual/reference/operator/aggregation/slice/

以下语法返回数组中指定位置的元素:

db.in_house_beta.aggregate([

 { $project: { "experience_combined": { $slice: [ "$experience_combined", 1 ] } } },
 { $unwind: "$experience_combined" },
 { $unwind: "$experience_combined.Company" },
 { $group:{ _id:{ Company:'$experience_combined.Company'}, count: { $sum:1} } 

}])


0

你可以使用$pop来删除数组的第一个元素。

$pop操作符可以删除数组的第一个或最后一个元素。将$pop的值设为-1可以删除数组的第一个元素,将其设为1可以删除数组的最后一个元素。

你可以将它应用到你的投影中。

这里是文档: mongoDb的$pop文档


我无法从数组中删除第一个元素,因为我需要它在同一聚合查询中的下一个投影中。我只想忽略第一个元素。 - Swapna
我想将数组中除第一个项目外的所有项目投影到一个新字段中,该字段与此查询完全相反 :: {             “$project”:{                 “ServRef”:{“$arrayElemAt”:[“$ ServicesReferences”,0]}             }         } - Swapna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接