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 } 猫鼬的选项
好友
我有一个集合,其中大约有 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 } 猫鼬的选项