Mongodb更新知道其一个字符串的数组的数组
如果我在文档中有这样的结构Mongodb更新知道其一个字符串的数组的数组,mongodb,Mongodb,如果我在文档中有这样的结构 ... updatedAt: 2021-01-17T16:44:28.824+00:00 vid: (Array) 0: (Array) 0: "adfsdfasfd" 1: "this is some sample text" 2: "https://example.com" 1: (Array) 0: "gfjghjhjgh" 1: &q
...
updatedAt: 2021-01-17T16:44:28.824+00:00
vid: (Array)
0: (Array)
0: "adfsdfasfd"
1: "this is some sample text"
2: "https://example.com"
1: (Array)
0: "gfjghjhjgh"
1: "this is another sample text"
2: "https://example2.com"
...
例如,如何更新知道“adfsdfasfd”的数组vid[0][0”
为了获得整个vid[0][0]阵列,我使用以下方法:
const foundVid = await db.collection('users').find({vid: {$elemMatch: {$elemMatch: {$in: ["adfsdfasfd"]}}}}).project({"vid.$": 1, "_id": 0 }).toArray()
哪个控制台.log(foundVid):
然后我尝试了$set和$addToSet,如下所示:
let update = {
vid: [
[foundVid[0].vid[0][0], foundVid[0].vid[0][1], foundVid[0].vid[0][2], views, likes, date]
]
}
await db.collection('users').updateOne(
{
vid: {
$elemMatch: {
$elemMatch: {
$in: [
"adfsdfasfd"
]
}
}
}
},
{ $addToSet : update }
)
但它似乎不起作用
编辑:我试图通过知道一个数组元素的第一个字符串(它是一个id)来更新它,所以在如上所述更新我的vid[0][0]之后,它应该是这样的:
...
updatedAt: 2021-01-17T16:44:28.824+00:00
vid: (Array)
0: (Array)
0: "adfsdfasfd"
1: "this is some sample text"
2: "https://example.com"
3: 1000
4: 100
5: <a date here>
1: (Array)
0: "gfjghjhjgh"
1: "this is another sample text"
2: "https://example2.com"
...
看起来你离这里很近。正如您所指出的,要匹配数组中的该值,您可以运行以下查询:
db.collection.find({
"vid": {
$elemMatch: {
$elemMatch: {
$in: [
"adfsdfasfd"
]
}
}
}
})
但要更新它,您需要:
db.collection.update({
"vid": {
$elemMatch: {
$elemMatch: {
$in: [
"adfsdfasfd"
]
}
}
}
},
{
"$push": {
"vid.$": {
$each: [
1000,
100,
new Date()
]
}
}
})
这里的关键是
看来你离这里很近了。正如您所指出的,要匹配数组中的该值,您可以运行以下查询:
db.collection.find({
"vid": {
$elemMatch: {
$elemMatch: {
$in: [
"adfsdfasfd"
]
}
}
}
})
但要更新它,您需要:
db.collection.update({
"vid": {
$elemMatch: {
$elemMatch: {
$in: [
"adfsdfasfd"
]
}
}
}
},
{
"$push": {
"vid.$": {
$each: [
1000,
100,
new Date()
]
}
}
})
这里的关键是
你能告诉我你想得到什么样的结果吗?更新后,您的原始文档应该是什么样子?更新了我试图实现的更好的细节扫描您显示了您试图达到的结果?更新后,您的原始文档应该是什么样子的?更新后,我试图获得更好的细节。ID是一个数组数组,而不是包含“adfsdfasfd”思想的直接数组,请使用mongodb@m4tt的屏幕截图检查我的类似线程。我马上就来看看。谢谢您指出它。@m4tt更新了答案。@m4tt不,$push将盲目地将任何您想要的东西推送到匹配的数组中。为了检查是否需要将匹配查询调整为不选择包含这些变量的数组。因此,
$elemMatch
需要添加类似于$nin:['xxx']
的内容。@m4tt如果是这种情况,我不会使用数组来存储该日期。它需要像{name:'adfsdfasfd',likes:1000,date:date等}
这样的对象。否则,更新这些东西对你来说将是一场噩梦。vid是一个数组数组,而不是包含“adfsdfasfd”思想的直接数组,请使用mongodb@m4tt的屏幕截图检查我的类似线程。我马上就来看看。谢谢您指出它。@m4tt更新了答案。@m4tt不,$push将盲目地将任何您想要的东西推送到匹配的数组中。为了检查是否需要将匹配查询调整为不选择包含这些变量的数组。因此,$elemMatch
需要添加类似于$nin:['xxx']
的内容。@m4tt如果是这种情况,我不会使用数组来存储该日期。它需要像{name:'adfsdfasfd',likes:1000,date:date等}
这样的对象。否则,更新这些东西对你来说将是一场噩梦。