比如我现在有两个表,结构分别为:
// 表 A :
[{
id: 1,
name: 'aa'
}, {
id: 2,
name: 'bb'
}, {
id: 3,
name: 'cc'
}]
// 表 B :
[{
user: '张三',
array: [{ id: 1, name: 'aa' }, { id: 2, name: 'bb' }, { id: 3, name: 'cc' }]
}, {
user: '李四',
array: [{ id: 1, name: 'aa' }, { id: 2, name: 'bb' }, { id: 3, name: 'cc' }]
}, {
user: '王五',
array: [{ id: 1, name: 'aa' }, { id: 2, name: 'bb' }, { id: 3, name: 'cc' }]
}]
如果我现在操作修改 表A 中的数据,比如 id: 2
所在对象改为 { id: 2, name: 'dd' }
请问 mongo 是否可以在修改 表A 的同时修改 表B 中所有人物的 array 中的 id: 2
所在项
我现在能想到的就是笨办法就是改完 表A 之后嵌套遍历 表B,在通过匹配逐一修改,但我感觉这样做既没有效率也够笨重
还望指点,谢谢!
你可以先用 $lookup 连接表 A 和表 B,然后使用 $map 和 $mergeObjects 更新表 B 中的数据:
db.B.aggregate([
{
$lookup: {
from: 'A',
let: { array: '$array' },
pipeline: [
{
$match: {
$expr: { $in: ['$_id', '$$array.id'] }
}
}
],
as: 'A'
}
},
{
$addFields: {
array: {
$map: {
input: '$array',
as: 'item',
in: {
$mergeObjects: [
'$$item',
{
$arrayElemAt: [
{
$filter: {
input: '$A',
as: 'a',
cond: { $eq: ['$$a._id', '$$item.id'] }
}
},
0
]
}
]
}
}
}
}
},
{
$project: {
A: 0
}
},
{
$out: 'B'
}
])
可以使用 MongoDB 的 $[] 操作符和 $ positional operator 实现在修改 表A 的同时修改 表B 中所有人物的 array 中对应数据项。
db.collection('tableA').updateOne(
{ id: 2 },
{ $set: { name: 'dd' } }
)
db.collection('tableB').updateMany(
{ 'array.id': 2 },
{ $set: { 'array.$.name': 'dd' } }
)
第一个命令会更新 表A 中id为2的元素,将其名称改为 "dd" 。
第二个命令使用了多重数组过滤器来筛选所有包含 id 为2的元素的 array 字段。接下来,使用 $ 及 . 符号来匹配嵌套元素,将其名称修改为 "dd" 。
MongoDB是一种文档导向数据库管理系统,由C++撰写而成。 本章节我们将为大家介绍如何使用 Node.js 来连接 MongoDB,并对数据库进行操作。 如果你还没有 MongoDB 的基本知识,可以参考我们的教程:MongoDB 教程。 安装驱动 本教程使用了淘宝定制的 cnpm 命令进行安装: $ cnpm install mongodb 接下来我们来实现增删改查功能。 创建数据库 要
本文向大家介绍Node.js连接mongodb实例代码,包括了Node.js连接mongodb实例代码的使用技巧和注意事项,需要的朋友参考一下 前面介绍了node.js操作mysql以及redis的内容,这里继续学习操作mongodb的内容。 安装驱动 安装命令 安装成功 数据库操作 因为mongodb是文档类型的数据库,与mysql有很大不同,mongodb会自动创建数据库和集合,并不需要提前进
问题内容: 我将mongodb的node-mongodb-native驱动程序用于编写网站。 我有一个关于如何一次打开mongodb连接,然后在中的集合名称用户和中的集合名称帖子中使用它的问题 我想在其中打开数据库连接以为用户插入/保存数据并发布帖子 当前代码,我的 我曾经在如下 和 问题答案: 您可以连接一次,然后根据需要重复使用多次: 然后重用它:
我正在处理一个节点。js服务器,连接到MongoDB,用TypeScript编写。当我尝试使用MongoDB时,它不会创建连接,但是当我检查mongo输出时,它似乎确实创建了连接。 在节点中定义连接的代码中缺少了什么。js? 我的连接字符串是 我的连接方式: Mongo输出: 2018-11-08T23:06:24.106 0100网络[监听器]连接从127.0.0.1:51345#11接受(2个
问题内容: 我有一个ajax调用,需要返回一个promise。功能如下 在执行下一个动作之前,我必须等待该功能执行。我该如何保证这个功能? 我尝试了以下操作,它给了我一个错误,说: 问题答案: 您有错误,因为它不是Promise。承诺异步功能非常容易(如今,nodejs具有内置的Promise支持):
问题内容: 我想知道是否有人知道如何在node.js中实现setTimeout。我相信我在某处读到它不是V8的一部分。我迅速尝试找到实现,但是在source(BIG)中找不到它。例如,我找到了这个timers.js文件,然后例如链接到timer_wrap.cc。但是这些文件并不能完全回答我的所有问题。 V8有实施吗?我想从源头上也可以得出答案。 如何实施?javascript还是本机还是两者结合?