Javascript 将MongoDB中用户的对象转换为数组

Javascript 将MongoDB中用户的对象转换为数组,javascript,database,mongodb,Javascript,Database,Mongodb,我的集合中有多个用户,每个用户都有一个会话对象,如下所示 { user: 'adam', sessions: { key: some-value, key: some-value } } { user: 'chris', sessions: { key: some-value, key: some-value } } 我根据用户名获取文档。让我们假设我想要亚当的治疗 所以我运行了db.collection.find({user:'Adam'}

我的集合中有多个用户,每个用户都有一个会话对象,如下所示

{
  user: 'adam',
  sessions: {
   key: some-value,
   key: some-value
  }
} 
{
  user: 'chris',
  sessions: {
   key: some-value,
   key: some-value
  }
} 
我根据用户名获取文档。让我们假设我想要亚当的治疗

所以我运行了db.collection.find({user:'Adam'}),它提供了Adam的完整文档。现在我想要“Adam”的sessions,但是sessions对象应该转换成如下对象数组:

{
 user: 'adam'
 sessions : [ { key: value },{ key: value } ]
}
我想将用户的会话转换成一个对象,这意味着我想在特定的用户名而不是整个集合上执行$objectToArray

正是我想要的用户

说明:

我将节点作为后端运行,我有一个名为“getuserdata”的路由,它根据用户名获取特定用户的数据。因此,当我使用用户名adam点击该路由时,它将从数据库中获取数据。adam的会话应该是一个对象数组,如上图所示,而不是数据库中的对象。

我在做什么


我正在后端运行一个for in循环,将它们转换为对象数组,但速度很慢。

以这个对象为例

const obj = { 
  key1: "value1",
  key2: "value2"
}
我们可以使用对象键上的映射将其转换为模式
[{key1:value1},{key2:value2}]

const arrayFromObj = Object.keys(obj).map(value => { 

    return { value: obj[value] }
  
})

您可以使用项目部分中的
$map
来执行此操作

  • $map
    使用
    $objectToArray
    将输入会话作为要转换的数组
  • 内部映射将对象键和值的数组转换为
    $arrayToObject

你能提供一些例子吗,我不太明白。我问的是
$ArrayObject:[[“$$this”]]
会话使用$objectToArray从输入转换为数组,接下来在
中我们将得到
k
v
对象格式,所以我们只是在转换
{k:”,v:}
$$this
包含这个
{k:”,v:“}
,我们只是使用
[]
括号将其转换为数组,
[$$this]
表示这个=>
[{k:”,v:“}]
$arrayToObject
将该数组转换为对象格式意味着原始的键和值格式。我已经解释清楚了。。
db.collection.find(
{ user: "adam" },
{
  user: 1,
  sessions: {
    $map: {
      input: { $objectToArray: "$sessions" },
      in: { $arrayToObject: [["$$this"]] }
    }
  }
})
//run from mongodb client
//sample user data preparation
> db.users15.find();
{ "_id" : ObjectId("5f4fbfbc3372ab5da3a605ac"), "user" : "adam", "sessions" : { "key1" : 1123, "key2" : 1124 } }
{ "_id" : ObjectId("5f4fbfbc3372ab5da3a605ad"), "user" : "chris", "sessions" : { "key1" : 2122, "key2" : 2134 } }
// Mongo query, variable defined an user for dynamic passing in match condition
> var v_user = "adam"
> db.users15.aggregate([
...  {$match:{user:v_user}},
...  {$project:{user:1,
...             sessionArray:{$objectToArray:"$sessions"}
...         }
...     }
... ]);
//output showing conversion from session object to array for key value pair
{ "_id" : ObjectId("5f4fbfbc3372ab5da3a605ac"), "user" : "adam", "sessionArray" : [ { "k" : "key1", "v" : 1123 }, { "k" : "key2", "v" : 1124 } ] }
>
//Further,the mongo query gives correct output for nested objects as well.
//Example below.
> db.users15.find().pretty();
{
        "_id" : ObjectId("5f4fbfbc3372ab5da3a605ac"),
        "user" : "adam",
        "sessions" : {
                "key1" : 1123,
                "key2" : 1124
        }
}
{
        "_id" : ObjectId("5f4fbfbc3372ab5da3a605ad"),
        "user" : "chris",
        "sessions" : {
                "key1" : 2122,
                "key2" : 2134
        }
}
{
        "_id" : ObjectId("5f5069ed3372ab5da3a605ae"),
        "user" : "sriny",
        "sessions" : {
                "key1" : 2122,
                "key2" : 2134,
                "key3" : {
                        "server1" : 2344,
                        "server2" : 9999
                }
        }
}
>
> var v_user = "sriny"
> db.users15.aggregate([
...  {$match:{user:v_user}},
...  {$project:{user:1,
...             sessionArray:{$objectToArray:"$sessions"}
...         }
...     }
... ]).pretty();
{
        "_id" : ObjectId("5f5069ed3372ab5da3a605ae"),
        "user" : "sriny",
        "sessionArray" : [
                {
                        "k" : "key1",
                        "v" : 2122
                },
                {
                        "k" : "key2",
                        "v" : 2134
                },
                {
                        "k" : "key3",
                        "v" : {
                                "server1" : 2344,
                                "server2" : 9999
                        }
                }
        ]
}
>