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
}
}
]
}
>