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等}
这样的对象。否则,更新这些东西对你来说将是一场噩梦。