MongoDb: Select 一个特定条件的随机记录并更新它

MongoDb: Select a random record with a specifi condition and update it

好友

我有一个集合,其中大约有 20 条 lastAccessed 记录为 null,现在我想 select 一个随机的 lastAccessed 并用 $$Now 更新它,我有下面的代码

    db.myCollection.aggregate([
      { $match: { lastAccessed: { $exists: False}  }},
      { $sample:{ size: 1 }}
    ]);
    db.myCollection.updateOne(
      { _id: 1 },
      {
        $set: {
            tableName: 'myTable',
            lastAccessed: '$$NOW'
        }
      })

我的问题是如何知道随机 selected 记录的 ID 以正确更新它?

对于您的场景,您可以在聚合管道的末尾使用 $merge 来执行按 ID 行为更新。

db.collection.aggregate([
  {
    $match: {
      "lastAccessed": {
        $exists: false
      }
    }
  },
  {
    "$sample": {
      "size": 1
    }
  },
  {
    $set: {
      tableName: "myTable",
      lastAccessed: "$$NOW"
    }
  },
  {
    "$merge": {
      "into": "collection",
      "on": "_id",
      "whenMatched": "replace"
    }
  }
]).forEach( function(myDoc) { print( "tableName: " + myDoc.tableName ); } );

这里是Mongo playground供您参考。

如果我们不想使用聚合,

要获取更新文档,可以使用findOneAndUpdate()

db.collection.findOneAndUpdate(
    { lastAccessed: { $exists: false } },
    { $set: { lastAccessed: "$$NOW" } },
    { returnOriginal: false }
)

使用{ returnOriginal: true | false } Mongodb 3.6 早期版本的选项,

对于MongoDb3.6及3.6之后的版本,可以使用{returnDocument: "after", "before" },

{ 新:真 | false } 猫鼬的选项