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"
  1: (Array)
    0: "gfjghjhjgh"
    1: "this is another sample text"
    2: "https://example2.com"
...

例如,我如何更新数组 vid[0][0] 知道“adfsdfasfd”?

为了获得整个 vid[0][0] 数组,我正在使用这个:

const foundVid = await db.collection('users').find({vid: {$elemMatch: {$elemMatch: {$in: ["adfsdfasfd"]}}}}).project({"vid.$": 1, "_id": 0 }).toArray()

其中console.log(foundVid):

{ 
  vid: [
         [
           "adfsdfasfd"
           "this is some sample text"
           "https://example.com"
         ]
       ]
}

然后我尝试了 $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"
...

编辑 2:对不起,我认为“更新”一词是隐含的,而不是更改数组,我需要更新它,就好像它是一个 $set。let update = ...这就是为什么我要使用前三个当前值 + 更新的变量重新创建数组 ( ) views, likes, date

$set 的问题在于它似乎更新了整个 vid 数组,其中只有这个数组导致:

...
updatedAt: 2021-01-17T16:44:28.824+00:00
vid: [
   0: [
     0: "adfsdfasfd"
     1: "this is some sample text"
     2: "https://example.com"
     3: 1000
     4: 100
     5: <a date here>
   ]
]
...
4

1 回答 1

2

看起来你离这里很近。正如您所指出的,要匹配数组数组中的该值,您将运行以下查询:

db.collection.find({
  "vid": {
    $elemMatch: {
      $elemMatch: {
        $in: [
          "adfsdfasfd"
        ]
      }
    }
  }
})

但要更新它,您需要:

db.collection.update({
  "vid": {
    $elemMatch: {
      $elemMatch: {
        $in: [
          "adfsdfasfd"
        ]
      }
    }
  }
},
{
  "$push": {
    "vid.$": {
      $each: [
        1000,
        100,
        new Date()
      ]
    }
  }
})

这里的关键是位置 $ 运算符

操场

于 2021-01-27T16:47:22.857 回答