我有一个Mongo文档,其中包含一系列元素.
我想重置.handled数组中所有对象的属性.profile= XX.
该文件采用以下形式:
{
"_id": ObjectId("4d2d8deff4e6c1d71fc29a07"),
"user_id": "714638ba-2e08-2168-2b99-00002f3d43c0",
"events": [{
"handled": 1,
"profile": 10,
"data": "....."
} {
"handled": 1,
"profile": 10,
"data": "....."
} {
"handled": 1,
"profile": 20,
"data": "....."
}
...
]
}
Run Code Online (Sandbox Code Playgroud)
所以,我尝试了以下内容:
.update({"events.profile":10},{$set:{"events.$.handled":0}},false,true)
Run Code Online (Sandbox Code Playgroud)
但是,它仅更新每个文档中第一个匹配的数组元素.(这是$的定义行为- 位置运算符.)
如何更新所有匹配的数组元素?
我在mongodb中有一个文档,我需要更新2层深度嵌套的对象数组,如下所示:
{
id: 1,
items: [
{
id: 2,
blocks: [
{
id: 3
txt: 'hello'
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果只有一个级别的深度数组,我可以使用位置运算符来更新其中的对象,但对于第二级,我唯一的选择是使用位置运算符和嵌套对象的索引,如下所示:
db.objects.update({'items.id': 2}, {'$set': {'items.$.blocks.0.txt': 'hi'}})
Run Code Online (Sandbox Code Playgroud)
这种方法有效,但对我来说似乎很危险,因为我正在构建一个Web服务,索引号应该来自客户端,它可以发送100000作为索引,这将迫使mongodb创建一个具有空值的100000索引的数组.
有没有其他方法来更新这样的嵌套对象,我可以引用对象的ID而不是它的位置,或者可能是在查询中使用它之前检查提供的索引是否超出范围的方法?
以下是MongoDB文档:
{
"_id" : 2,
"mem_id" : M002,
"email" : "xyz@gmail.com",
"event_type" : [
{
"name" : "MT",
"count" : 1,
"language" : [
{
"name" : "English",
"count" : 1,
"genre" : [
{
"name" : "Action",
"count" : 6
},
{
"name" : "Sci-Fi",
"count" : 3
}
],
"cast" : [
{
"name" : "Sam Wortington",
"count" : 2
},
{
"name" : "Bruce Willis",
"count" : 4
},
{
"name" : "Will Smith",
"count" : 7 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将交易插入到交易列表中。
这是文件:
{
"_id" : ObjectId("5cb26787c3eb6c8229a92954"),
"first_name" : "testing",
"last_name" : "testing",
"ssn" : "123456789",
"address" : "123 testing st",
"account" : {
"account_number" : 32362897,
"last_access_timestamp" : "2019-04-13 18:49:43",
"account_type" : [
{
"checking" : {
"balance" : 0,
"transaction" : [ ]
}
},
{
"saving" : {
"balance" : 0,
"transaction" : [ ]
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
ssn 应该是唯一的,所以我将其用作匹配标准。这是我用来插入检查交易列表的查询:
db.customer.update({'ssn': '123456789'},
{'$push': {'account.account_type.checking.transaction': {
'amount': 120,
'transaction_type': 'deposit',
'timestamp': '11:11:11'
}}})
Run Code Online (Sandbox Code Playgroud)
预期的结果是:
{
"_id" : …Run Code Online (Sandbox Code Playgroud) 我正在开发一个快速js应用程序,我需要更新嵌套数组.1)架构:
//Creating a mongoose schema
var userSchema = mongoose.Schema({
_id: {type: String, required:true},
name: String,
sensors: [{
sensor_name: {type: String, required:true},
measurements: [{time: String}]
}] });
Run Code Online (Sandbox Code Playgroud)
2)这是代码片段,解释如下:
router.route('/sensors_update/:_id/:sensor_name/')
.post(function (req, res) {
User.findOneAndUpdate({_id:req.body._id}, {$push: {"sensors" :
{"sensor_name" : req.body.sensor_name , "measurements.0.time": req.body.time } } },
{new:true},function(err, newSensor) {
if (err)
res.send(err);
res.send(newSensor)
}); });
Run Code Online (Sandbox Code Playgroud)
我能够使用带推技术的findOneAndUpdate成功更新测量数组的值,但是当我尝试向传感器阵列添加多个测量时,我失败了.
这是当我向传感器阵列发布第二次测量时得到的当前json:
{
"_id": "Manasa",
"name": "Manasa Sub",
"__v": 0,
"sensors": [
{
"sensor_name": "ras",
"_id": "57da0a4bf3884d1fb2234c74",
"measurements": [
{
"time": "8:00"
}
]
},
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下结构更新我的 mongo 集合
{
"_id" : "T6GqWsi9qSxnyGzgC",
"spec_name" : "test",
"version" : "test",
"message_type" : "test",
"message_trigger" : "test",
"segments" : [
{
"segment_id" : "MSH",
"sequences" : [
{
"dataType" : "ST",
"optionality" : "R",
"name" : "Field Seperator"
},
{
"dataType" : "ST",
"optionality" : "R",
"name" : "Encoding Characters"
},
{
"dataType" : "HD",
"optionality" : "O",
"name" : "Sending Application"
},
{
"dataType" : "HD",
"optionality" : "O",
"name" : "Sending Facility"
},
{
"dataType" : …Run Code Online (Sandbox Code Playgroud) 我正在尝试$push进入嵌套数组Object,但它似乎不起作用。我不确定我做错了什么。
我的数据库是这样的:
{
customers: {
name: String,
address: String,
proj_managers: [
{
name: String,
username: String,
projects: [
name: String,
tags: [
{
tag_no: Number,
tag_id: String,
time: String,
product_id: String,
urls: [
url: String,
count: Number
],
gps: String,
deactivate: Boolean
}
]
]
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想做的是将$push标签数组放入tags特定的project. 我的后端使用GraphQL:
/index.js
// GraphQL schema
import schema from './schema'
// Mongoose Models
import Customer from './models/Customer'
import …Run Code Online (Sandbox Code Playgroud) 我有以下mongodb文档结构:
[
{
"_id": "04",
"name": "test service 4",
"id": "04",
"version": "0.0.1",
"title": "testing",
"description": "test",
"protocol": "test",
"operations": [
{
"_id": "99",
"oName": "test op 52222222222",
"sid": "04",
"name": "test op 52222222222",
"oid": "99",
"description": "testing",
"returntype": "test",
"parameters": [
{
"oName": "Param1",
"name": "Param1",
"pid": "011",
"type": "582",
"description": "testing",
"value": ""
},
{
"oName": "Param2",
"name": "Param2",
"pid": "012",
"type": "58222",
"description": "testing",
"value": ""
}
]
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
我已经能够使用$ elemMatch来更新操作中的字段,但是当我尝试对参数执行相同的操作(修改)时,它似乎不起作用.我想知道我应该尝试哪种其他方法,以便能够成功更新特定参数中的字段,通过其pid查找它.
我目前拥有且不起作用的更新代码如下所示:
var oid …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的对象.
{
_id: '577fe7a842c9b447',
name: 'Jacob\'s Bronze Badges',
competitors: [
{
_id: '577fe7a842c9bd6d',
name: 'Peter\'s Silver Badges',
sites: [
{
_id: '577fe7a842c9bd6d',
name: 'Facebook',
url: 'fb.com/peter'
},
{
_id: '577fe7a842c9bd6d'
name: 'Google',
url: 'google.com/peter'
}
]
},
{
_id: '599fe7a842c9bd6d',
name: 'Paul\'s Gold Badges',
sites: [
{
'_id': '577fe7a842c9bd6d',
name: 'Facebook',
url: 'fb.com/paul'
},
{
_id: '577fe7a842c9bd6d',
name: 'Google',
url: 'google.com/paul'
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的目标是引用competitors数组并使用所有值更新内部的项目req.body.我基于这个代码关闭的这个答案,以及该另一个.
Location.update(
{ 'competitors._id': req.params.competitorId, }, …Run Code Online (Sandbox Code Playgroud) 我正在尝试在mongodb 3.6.0-rc3中使用数组过滤器,就像在doc示例中一样,但是没有使任何行受到影响并且没有错误。
示例已简化。我知道可以使用$作为位置运算符来完成此操作,但我打算将此功能用于两级嵌套数组。
db.getCollection('books').update({},
{
$set: { "authors.$[element].firstName": "Joe" }
},
{
arrayFilters: [ { element: { "_id": ObjectId("some_id") } } ],
multi: true
})
Run Code Online (Sandbox Code Playgroud)
有人尝试过吗?
我知道这个问题是重复的,但我不知道为什么我被卡住了
问题:
如何"requirement.$.update"使用 find by_id和requirement.update._id (如果需要requirement._id)编辑数组文档
// edit version number level2
exports.editVersionNumberPost = function(req, res){
var query = {
date: req.body.date,
number: req.body.number,
description: req.body.description
}
Project.findOneAndUpdate({ name: req.params.name,
"requirement._id" : req.params.versionID,
"requirement.update._id" : req.params.versionNumID},
{"$set":
{"requirement.$.update" : query
}
}, { new: true },
function(err, obj){})
};
Run Code Online (Sandbox Code Playgroud)
我的架构
----------------
namr: String
requirement:[{
version: Number,
update:[{
date: Date,
number: Number,
description: String
}]
}],
--------
Run Code Online (Sandbox Code Playgroud) 我有 2 个集合:
用户
{
id: 1,
name: "Michael",
starred: [1, 2]
}
Run Code Online (Sandbox Code Playgroud)
学校
{
id: 1,
name: "Uni",
faculties: [{
id:1000,
name: "faculty1",
subjects: [
{id: 1, name: "sub1"},
{id: 2, name: "sub2"},
{id: 3, name: "sub3"}
]
}]
}
Run Code Online (Sandbox Code Playgroud)
现在,在我的用户集合中,我想查找并收集每个主题对象,其 ID 在已加星标中找到。IE。starred: [1,2]包含id我想要的主题。
所以最终结果应该返回
[{id: 1, name: sub1},{id: 2, name: sub2}]
Run Code Online (Sandbox Code Playgroud)
我目前正在使用 whis 聚合管道
{$match: {name: 'Michael'}},
{$unwind: "$faculties"},
{$unwind: "$faculties.subjects"},
{$lookup:
{
from: 'schools',
localField: 'starred',
foreignField: 'faculties.subjects.id',
as: 'starredSubjects'
}
},
{$project: …Run Code Online (Sandbox Code Playgroud) 我有以下架构
UserSchema: Schema = new Schema({
username: String,
password: String,
chat: [{
lastSeen: { type: Date, default: Date.now },
room: {
type: Schema.Types.ObjectId, ref: 'ChatRoom'
}
}],
});
Run Code Online (Sandbox Code Playgroud)
我想对进行静态方法UserSchema,以便chat[i].lastSeen通过给定更新room _id
UserSchema.statics.lastSeen =
function lastSeen(username: string, roomId: number, date: Date) {
this.update({
username: username,
chat: {
$elemMatch: {
'room._id': roomId
}
}},
{
$set: { 'chat.$[???].lastSeen': date}
});
}
Run Code Online (Sandbox Code Playgroud)
我找不到如何通过他的元素获取chat元素room._id然后进行更新。有什么帮助吗?
编辑
我的案子与建议的重复案类似但不相同,因为那里的人知道所有ids,而我不知道chat._id。