当使用mongodb $ lookup时,如何$ slice外部集合文档数组的结果

时间:2016-06-06 06:45:00

标签: mongodb

这是我的代码

AbcSchema.aggregate([
            { $match: query },
            {
                $lookup: { from: 'xyz', localField: '_id', foreignField: 'place_id', as: 'xyzArray' }
            }
         ])

现在我得到了这个结果:

{
 _id : "abc1",
 abcfield1 : "...",
 abcfield2 : "...",
 xyzArray : [{_id : "xyz1", place_id : "abc1", xyzfield1 : "..."}, 
             {_id : "xyz2", place_id : "abc1", xyzfield1 : "..."},
             {_id : "xyz3", place_id : "abc1", xyzfield1 : "..."},
            ...] //all matching results
}

所以现在让我说我只想在xyzArray中找到2个文件,那么我该如何实现呢?

我的要求是将'xyzArray'长度限制为'n'。

2 个答案:

答案 0 :(得分:1)

这是动态查询。您可以更改 $ slice 中的数字,以获得所需数量的数组元素。

db.AbcSchema.aggregate([
    { $match: {_id : "abc1"} },
     {
      $unwind: "$_id"
    },
    {
        $lookup: { from: 'xyz', localField: '_id', foreignField: 'place_id', as: 'xyzArray' }
    },
    { $project: { abcfield1 : 1,
                  abcfield2 : 1,
                  xyzArrayArray: { $slice: ["$xyzArray", 2]  }                     
                }
    }
]).pretty();

答案 1 :(得分:0)

使用 $ project $ arrayElemAt

的一种可能解决方案
// "T read" is the read line from the CSV.

T value;
var tup = new Tuple<string, string>(name, date);
if (myDictionary.TryGetValue(tup, out value))
{
    // modify value by calling the interface method / using the interface property
    value.AddVolume();
}
else 
{
    // add value to list and dictionary
    myDictionary.Add(tup, read);
    myList.Add(read);
}

示例输出: -

db.AbcSchema.aggregate([
    { $match: {_id : "abc1"} },
     {
      $unwind: "$_id"
    },
    {
        $lookup: { from: 'xyz', localField: '_id', foreignField: 'place_id', as: 'xyzArray' }
    },
    { $project: { abcfield1 : 1,
                  abcfield2 : 1,
                  firstxyzArray: { $arrayElemAt: [ "$xyzArray", 0 ] },
                  secondxyzArray: { $arrayElemAt: [ "$xyzArray", 1 ] }
                }
    }
]).pretty();