gpt4 book ai didi

javascript - 更新子文档 Mongoose 中的字段

转载 作者:可可西里 更新时间:2023-11-01 10:04:29 25 4
gpt4 key购买 nike

我的父模型

var GameChampSchema = new Schema({
name: String,
gameId: { type: String, unique: true },
status: Number,
countPlayers: {type: Number, default: 0},
companies: [
{
name: String,
login: String,
pass: String,
userId: ObjectId
}
],
createdAt: {type: Date, default: Date.now},
updateAt: Date
})

我需要在未设置的第一个 child 中插入 userId 属性

因此,只需要对具有条件 ({status: 0, countPlayers: { $lt: 10 }) 的父级执行此操作

最佳答案

因为这是一个嵌入式文档,所以很容易:

如果您要更新作为数组第一个元素的文档,该文档没有有 userId

db.collection.update(
{
"status": 0,
"countPlayers": {"$lt": 10 },
"companies.userId": {"$exists": false }
},
{ "$set": {"companies.$.userId": userId } }
)

这会很好,但显然这与 MongoDB 处理逻辑的方式不匹配,它认为如果数组中有某物 确实 则没有任何匹配目前的领域。您可以使用聚合框架获取该元素,但这无助于找到我们需要的位置。

一个简化的提议是数组中根本没有元素:

db.collection.update(
{
"status": 0,
"countPlayers": {"$lt": 10 },
"companies.0": {"$exists": false }
},
{ "$push": {"userId": userId } }
)

这只是在数组上添加了一个新东西。

对我来说合乎逻辑的事情是你实际上知道关于这个条目的一些事情并且你只想设置userId字段。所以我会在登录时匹配:

db.collection.update(
{
"status": 0,
"countPlayers": {"$lt": 10 },
"companies.login": login,
},
{ "$set": {"companies.$.userId": userId } }
)

最后,如果这只是更新数组中的 first 元素,那么我们不需要匹配位置,因为我们已经知道它在哪里:

db.collection.update(
{
status: 0,
countPlayers: {"$lt": 10 }
},
{ $set: { "companies.0.userId": userId } }
)

回到我的逻辑案例,看文档结构:

{ 
"_id" : ObjectId("530de54e1f41d9f0a260d4cd"),
"status" : 0,
"countPlayers" : 5,
"companies" : [
{ "login" : "neil" },
{ "login" : "fred", "userId" : ObjectId("530de6221f41d9f0a260d4ce") },
{ "login": "bill" },
]
}

因此,如果您要查找的是“第一个没有 userId 的文档”,那么这就没有意义了,因为有多个项目并且您已经有了一个 要更新的特定 userId。这意味着您必须指的是其中的一个。我们如何分辨是哪个一个?从用例来看,您似乎正在尝试根据您拥有的信息将那里的信息与 userId 相匹配。

逻辑说,寻找你知道的键值,并更新匹配的位置

只需将 db.collection 部分替换为您的 model 对象,以便与 Mongoose 一起使用。

请参阅 $exists 上的文档,以及 $set$push了解相关详情。

关于javascript - 更新子文档 Mongoose 中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22038962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com