我将mLab用于数据库。我有一个列表集合,每个列表都有一个带有_id,userId和项目数组的对象。
现在我想将新项目添加到特定列表的数组。
连接到Mongo的函数具有新的项目对象和列表ID。
如何找到正确的列表并将新项目添加到项目数组?
每个列表的JSON看起来像这样:
{
"_id": {
"$oid": "5ded5eb7e7179a3015b0672f"
},
"userID": "1234",
"items": [
{
"_id": "abc12345",
"name": "abc",
},
{
"_id": "abc12346",
"name": "def",
}
]
}
和连接到Mongo的功能看起来像这样:
function addItem({item, listId}) {
return MongoService.connect()
.then(db => {
const collection = db.collection('lists');
//need to do something here
})
}
我通常会找到Ramda和/或partial.lenses之类的库来解决这样的问题。这些库中的任何一个都将简化处理通常来自mongodb的复杂和/或嵌套数据的工作。
partial.lenses可能是更强大的选项,但是我不确定如何在此处将其嵌入到代码段中,因此这是使用Ramda的示例:
const lists = [
{
_id: { $oid: '1234' },
items: []
},
{
_id: { $oid: '2345' },
items: []
},
{
_id: { $oid: '3456' },
items: []
}
]
function addItem({item, listId}) {
const ix = lists.findIndex(
({ _id }) => _id.$oid === listId
)
return R.over(R.lensPath([ix, 'items']), R.append(item), lists)
}
console.log(
addItem({ item: 'hi', listId: '1234' })
)
console.log(
addItem({ item: 'hi', listId: '3456' })
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>