首页 文章

如何使用mongodb中的项目数组进行操作(过滤和排序)?

提问于
浏览
0

我有一个集合中的下一个项目:

{
    "_id" : ObjectId("5c0325eec104041f38a6f9ec"),
    "total_distict_words" : 137,
    "items" : [ 
        {
            "first" : 1
        }, 
        {
            "another" : 3
        }, 
{
            "house" : 5
        },

    .....

我正在尝试排序和过滤出现在items数组中的tops单词 .

问题是"item"有下一个模板: { <word>: <value> }

我试图操作或改造,但没有成功 .

首先,我如何使用mongodb和聚合操作"stats.items"数组?

其次,我怎样才能以字典形式进行转换,例如:

{ "llegaron": 1 } => { word: "llegaron", counter: "1" }

问题是当我使用某个元素操作时,我必须知道我想要访问的字段的名称,例如:

# users: [<name, age, posts>]
db.users.aggregate([{ $sort : { age : -1, posts: 1 }}] )

1 回答

  • 0

    我相信你有一个更短的方式来达到这个目的但是这里有一些可以玩的东西:

    db.collection.aggregate([
      { $unwind: "$items" },
      { $project: { items: { $objectToArray: "$items" } } },
      { $project: {
          items: {
            $map: {
              input: "$items",
              as: "item",
              in: {
                word: "$$item.k",
                counter: "$$item.v"
              }
            }
          }
        }
      },
      { "$group": { "_id": "$_id", "items": { "$push": "$items" } } },
      { "$project": {
          "items": {
            "$reduce": {
              "input": "$items",
              "initialValue": [],
              "in": {
                "$setUnion": [
                  "$$value",
                  "$$this"
                ]
              }
            }
          }
        }
      },
      { $unwind: "$items" },
      { $sort: { "items.counter": -1 }},
      { "$group": { "_id": "$_id", "items": { "$push": "$items" } } }
    ])
    

    我的想法是使用$objectToArray然后$map将您的 k:v 转换为 word: k, value: v 然后其余的只是通过少数项目/组& $sort 对您的数组项进行排序的方法 .

    我们还使用$reduce$setUnion来分组最终由 { "$group": { "_id": "$_id", "items": { "$push": "$items" } } }, 发生的那些讨厌的数组 .

    在一天结束时,使用下面的链接并按照管道的每个步骤来真正理解其含义和目的 . 我相信有一个更短的方法来获得相同的结果等...

    此外,您可以将此行 { $sort: { "items.counter": -1 }}, 中的排序顺序更改为 asc 为1, -1desc

    你可以看到working here

相关问题