- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要创建具有特定条件的子文档数组。如果 ip
agent
和 language
字段都完全匹配,那么就不需要添加新的子文档,如果其中任何一个下降,那么我需要创建一个新的。
但是当我尝试使用 $push
执行此操作时,它会返回我
Exception: StrictModeError: Path "ip" is not in schema, strict mode is `true`, and upsert is `true`.
findOneAndUpdate
更新整个文档和我的字段集,因为它们出现在数据库中。还尝试按照模式中显示的方式设置它,但它返回相同的错误。
userSchema中的数组
metadata: [mongoose.modelSchemas.UserMetaData],
用户元数据架构
var userMetaDataSchema = new mongoose.Schema({
ip: { type: String, default: '' },
agent: { type: String, default: '' },
language: { type: String, default: '' },
userCreated: {
id: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
name: { type: String, default: '' },
}
});
app.db.model('UserMetaData', userMetaDataSchema);
};
如果我尝试直接使用 findOneAndUpdate
到 UserMetaData
集合而不使用 $push
,它会起作用。
控制台的结果:
{
"_id" : ObjectId("5a00d35f03fc3eb63cbb1c6f"),
"agent" : "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
"ip" : "::ffff:192.168.33.10",
"language" : "en-US,en;q=0.5",
"userCreated" : {
"name" : "user2",
"id" : ObjectId("5a00d27a7fdf8e07f40d2123")
},
"__v" : 0
}
查询不起作用
var fieldsToSet = {
$push: {
metadata: {
agent: userAgent,
ip: userIp,
language: languages,
userCreated: {
name: req.user.username,
id: req.user._id,
}
}
}
};
var options = { upsert: true };
User.findOneAndUpdate(conditions, fieldsToSet, options, function(err, user) {....
创建此类数组的最佳方法是什么?谢谢。
最佳答案
这里的错误是由于尝试将 findOneAndUpdate
与 $push
和 {upsert: true}
选项一起使用而引起的,因为如果您想要插入或更新子文档,您应该使用 2 个不同的运算符 $set
进行更新,使用 $push
进行插入。所以这里的解决方案是使用不同的设置进行更新和插入:
var conditions = {
_id: req.user._id,
'metadata.ip': userIp,
'metadata.agent': userAgent,
'metadata.language': userLanguage,
'metadata.userCreated.name': req.user.username
};
var fieldsToSet = {
$set: {
'metadata.$.agent': userAgent,
'metadata.$.ip': userIp,
'metadata.$.language': userLanguage,
}
};
var fieldsToPush = {
$push: {
metadata: {
agent: userAgent,
ip: userIp,
language: userLanguage,
userCreated: {
id: req.user._id,
name: req.user.username,
}
}
}
};
var options = { upsert: true };
// check if thare is a match and overwright
User.findOneAndUpdate(conditions, fieldsToSet, options, function (err, setdocs) {
//if there is no match then push a new subdocument
if (setdocs == null) {
User.findByIdAndUpdate(req.user._id, fieldsToPush, function (err, pushdocs) {
//...
});
}
else {
//....
}
});
});
此解决方案归功于 Neil Lunn我现在找不到这个特定的解决方案
关于node.js - Mongoose - 使用 findoneandupdate 和 $push 添加或更新子文档(当 upsert 为 true 时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47148415/
我在 mongoose 的 findOneAndUpdate 中遇到问题。情况是我正在通过查找来更新文档。查询如下: UserModel.findOneAndUpdate({ individualId
以下是我的 mongo 数据库条目。 my-mongo-set:PRIMARY> db.stat_collection.find({name : /s/}) { "_id" : ObjectId("5
我正在尝试更新 mongodb 集合中的文档,但它对我不起作用。这是所有字段都到达后端的函数。我使用mlab在线mongo db router.post( '/accept', (req,re
我有一个应用程序,其中有一个教师数据库,其中包含一系列类(class) ID。创建新类(class)时,我尝试查找讲师的数据库条目并使用新类(class)的 ID 更新 classID 的数组。但是,
我正在尝试使用 findOneAndUpdate 更新存储在 mongoose 服务器中的文档之一。我将其设置为 PUT 请求,这就是我定义它的方式。 public updateConfigWithT
这个问题已经有答案了: findAndModify or findOneAndUpdate - "is not a function" (2 个回答) 已关闭 5 年前。 我花了整个早上的时间在谷歌上
我正在尝试使用 findOneAndUpdate 更新存储在 mongoose 服务器中的文档之一。我将其设置为 PUT 请求,这就是我定义它的方式。 public updateConfigWithT
该方法返回未定义。例如,在 findOneAndUpdate 解析之前完成。 exports.updateMovie = async (movie) => { try { re
尝试使用 findOneAndUpdate() 更改 MongoDB 中数组内的对象。我不清楚 mongoDB 的 nodeJS 驱动程序的文档。该文件看起来像这样: { _id:ObjectID
Tag schema结构如下: _id: "abcsd12312", nsp: "localhost.com", tags: [ 0: { tag: "#feedback",
我正在使用 Node、Express 和 Mongoose 开发 REST API。当我更新基本模型时,一切正常。但是当我在这种情况下尝试更新鉴别器对象 sportEvent 时,它不起作用。 Eve
我有一个 post 路由,它接收来自 express 应用程序中的 PUT 请求的数据,该应用程序旨在根据提交的表单输入更新 mongoose 文档。 “基本”模型是 Profile,我有两个 dis
我正在使用 mongodb 在某个集合中插入和更新一些文档。当我更新文档时,我只想获取修改后的字段。我可以通过使用 returnOriginal 选项进行更新来获取完整的新文档(包括修改后的字段),但
我正面临一个问题。我有一个名为 Car 的模型它具有以下结构。 { _id: '6179bd464c68a217e895703c', salesInfo: { salesDate: [
每当我进行更新 api 调用时,我只需要更新 serviceActiveFlag 状态。更新 api 调用后,我可以看到创建了一个包含空车辆数组的新文档,如下所示。 _id:59c76073c11d3
如果 componentId 和 wfInstanceId id 匹配,我需要更新“fields”数组中的类型、键和值。 这是我需要这样做的文档。 { "_id": { "$o
这个问题已经有答案了: mongodb: upserting: only set value if document is being inserted (4 个回答) 已关闭 5 年前。 我正在使用
我很想知道是否有更好的方法来更新字段值。我使用的字段值有时会存在,有时不会,具体取决于用户创建的帖子类型: 这是我的代码,用于列出要添加到数据库的字段 switch (req.body.postTyp
我有一个 Mongoose 模式,它有一个属性,它是 ObjectId 的数组。子文档。 如果需要删除/删除其中一个子文档,我当然想将其从父文档的数组属性中删除。 我的问题是:我以什么顺序执行子级的删
我目前正在与 Mongoose 一起工作,我遇到了一些我觉得很奇怪的事情。 我的代码如下: Challenge.findOneAndUpdate({ _id: req.params.cha
我是一名优秀的程序员,十分优秀!