我有一个如下所示的文档,我使用 mongo $map 来投影表内的字段并重命名键。$unwind由于某些内部复杂性,我无法使用。
{
"Table":[
{"Lookup":{
"CreatedBy":{
"id": "User001",
"Name":"UserName"
}
}
}]
}
Run Code Online (Sandbox Code Playgroud)
我期望的输出看起来像这样
{
"Table":[
{"Lookup":{
"CreatedBy":"UserName"
}
}]
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 mongo $map 来实现它,但不支持它
db.getCollection('TableDoc').aggregate([
{
"$project": {
"Table": {
"$map": {
"input": "$Table",
"in": {
"Lookup.CreatedAt": "$$this.Lookup.CreatedAt.Name",
}
}
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以在不使用 $unwind 的情况下实现此目的
有结构的文档:
{"appId":<id>,"time":<number>}
Run Code Online (Sandbox Code Playgroud)
对于这个例子,我们假设我们有:
{"appId":"A","time":1}
{"appId":"A","time":3}
{"appId":"A","time":5}
{"appId":"B","time":1}
{"appId":"B","time":2}
{"appId":"B","time":4}
{"appId":"B","time":6}
Run Code Online (Sandbox Code Playgroud)
是否可以按 appId 对文档进行分组,每个组按时间排序,并且从该组的最新时间开始显示所有结果,例如:
{"appId":"B","time":6}
{"appId":"B","time":4}
{"appId":"B","time":2}
{"appId":"B","time":1}
{"appId":"A","time":5}
{"appId":"A","time":3}
{"appId":"A","time":1}
Run Code Online (Sandbox Code Playgroud)
我尝试了这个查询:
collection.aggregate([{"$group":{"_id":{"a":"$appId"},"ttt":{"$max":"$time"}}},
{"$sort":{"_id.ttt":-1,"time":-1}}])
Run Code Online (Sandbox Code Playgroud)
但我只收到最后一次特定的 appId -> 2 结果,并且此查询更改了数据的结构。我想保留文档的结构,并且只像示例一样对它们进行分组和排序。
所以我有两个ObjectId位于不同集合中的 s,我希望将其合并为输出。所以这就像使用$lookup没有任何本地字段的函数一样。如果没有聚合,我可以简单地执行两个操作.findOne,但这需要两次 API 调用(这将创建两个连接)。有可能一并实现吗?
因此,如果没有聚合,它看起来就像这样:
let main_document =
db.findOne({
_id: ObjectId(first)
})
let subdocument =
db.findOne({
_id: ObjectId(second)
})
main_document.subdocument = subdocument
return main_document
Run Code Online (Sandbox Code Playgroud) javascript mongoose mongodb mongodb-query aggregation-framework
我有一个简单的文档,为用户存储对象数组,我希望获得这些数组的总和以及所有数组的总和;挑战在于某些文档缺少其他文档具有的字段,这导致我的聚合查询失败。
文档看起来像这样。
{
name: '',
type: '',
cars: [],
boats: [],
planes: []
}
Run Code Online (Sandbox Code Playgroud)
有些人没有船或飞机......这些文件可能看起来像
{
name: '',
type: '',
cars: []
}
Run Code Online (Sandbox Code Playgroud)
所以当我运行我的聚合时
[
{
'$match': {
'type': 'big_spender'
}
}, {
'$project': {
'name': '$name',
'cars': {
'$size': '$cars'
},
'boats': {
'$size': '$boats'
},
'planes': {
'$size': '$planes'
}
}
}, {
'$addFields': {
'total_vehicles': {
'$add': [
'$cars', '$boats', '$planes'
]
}
}
}
]
Run Code Online (Sandbox Code Playgroud)
我收到错误:“$size 的参数必须是数组,但类型为:缺失”
我很确定我可以使用 $exists 来避免这个问题,并返回 0,但我不知道该语法可能是什么样子。
我需要为不存在的数组返回 0,因此当我将它们添加到总数中时,我会得到正确的总数并且没有错误。
任何帮助表示赞赏。
我正在学习 Node 和 mongo,目前正在开发一个简单的服务器,该服务器只会从 mongodb 中获取 10 个随机文档,并在收到 get 请求时将它们作为响应发送。我的下一个目标是创建一个页面,该页面将在 html 页面中显示这 10 条记录,并具有一些基本样式。该页面还有一个“下一步”按钮,可以从数据库中获取另外 10 条随机记录。问题是如何确保在此过程中不会两次提取相同的记录?
我在编写 find/aggregate mongo 查询时遇到一些问题,其中我的要求是获取所有文档,但条件如下:
假设我有 2 个文档:
{
_id: 5ccaa76939d95d395791efd2,
name: 'John Doe',
email: 'john.doe@foobar.com',
private: true
}
{
_id: 5ccaa76939d95d395791efd2,
name: 'Jane Doe',
email: 'jane.doe@foobar.com',
private: false
}
Run Code Online (Sandbox Code Playgroud)
现在我试图弄清楚的查询是,如果该字段private为真,那么当我查询时,我必须获取除电子邮件字段之外的所有文档(如果private为真则不包括电子邮件字段),如下所示:
{
_id: 5ccaa76939d95d395791efd2,
name: 'John Doe',
private: true
}
{
_id: 5ccaa76939d95d395791efd2,
name: 'Jane Doe',
email: 'jane.doe@foobar.com',
private: false
}
Run Code Online (Sandbox Code Playgroud)
$redact在aggregate()中尝试过$cond,,,$$PRUNE以及$$DESCEND遇到$$REMOVE(看起来像是最新的功能),但无法获得所需的输出。请帮我查询
我有一个collection包含serviceDate特定操作的字段。我需要查找给定的日期范围是否有serviceDate缺失,如果找到,则返回serviceDate datesMongoDB 中日期范围之间缺失的列表。我的集合的 JSON 示例如下。
{
"_id" : ObjectId("5cefdb46bfbe1c0001f38413"),
"category" : "RENT",
"serviceDate" : ISODate("2019-06-15T05:30:00.000+05:30")
},
{
"_id" : ObjectId("5cefdb46bfbe1c0001f38412"),
"category" : "RENT",
"serviceDate" : ISODate("2019-06-14T05:30:00.000+05:30")
},
{
"_id" : ObjectId("5cefdb46bfbe1c0001f38411"),
"category" : "RENT",
"serviceDate" : ISODate("2019-06-13T05:30:00.000+05:30")
}
Run Code Online (Sandbox Code Playgroud)
示例:
情况 1:
如果集合有 10 个文档,并且服务日期从 2019 年 6 月 1 日到 2019 年 6 月 10 日开始。在我的查询中,我将 2019 年 6 月 4 日传递到 2019 年 6 月 7 日,结果应该为空。
情况 2:
如果集合有 9 …
我有 2 个不同的 MongoDB 集合 -员工和部门都包含共同的deptid。我想加入这两个集合并从两个集合中添加多个 $match 条件。
雇员:
{
Empid: 001
Name: "John"
Age: 41
Location: "Belfast"
deptid: "D101"
}
Run Code Online (Sandbox Code Playgroud)
部门:
{
deptID: "D101"
deptNM: "HR"
deptPr: "O"
}
Run Code Online (Sandbox Code Playgroud)
询问:
db.getCollection('Employees').aggregate([
{ $match:{
deptNM: "HR",
Age : {$gt: 40}
}
},
{ $lookup: {
from: "Dept",
localField: "deptid",
foreignField: "deptID",
as: "HR EMP"
}
},
{ $project: {
Empid: 1, Name: 1, Location: 1, deptNM: 1, deptPr: 1
}
}
])
Run Code Online (Sandbox Code Playgroud)
上面的查询不起作用,还有其他方法吗?
我有 2 个收藏:
用户收藏:
{
_id: ObjectId
}
Run Code Online (Sandbox Code Playgroud)
托托系列:
{
_id: ObjectId
fieldA: {_id: ObjectId}
fieldB: [{_id: ObjectId}, {_id: ObjectId}]
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试加入 A 集合的元素,其中fieldA 的 id或fieldB 的 id之一与以下聚合的用户 id匹配:
db.users.aggregate([
{
$lookup: {
from: "Toto",
let: { "user_id": "$_id" },
as: "fcollection",
pipeline: [
{ $match:
{$or:[
{"fieldB": {$elemMatch: {"_id": "$$user_id"}}},
{$expr: {$eq :["$fieldA._id", "$$user_id"]}}
]}
}
]
}
])
Run Code Online (Sandbox Code Playgroud)
但在输出中,我只是获取了文档中 fieldA 的 id 匹配的位置,但没有获取 fieldB 的 id 匹配的位置。我究竟做错了什么?
我正在努力解决一个恼人的问题。我在查询中使用聚合,我需要加入一些集合,并且输出必须是一个对象。这是我的代码...
usersModel.aggregate([
{
$match: { _id: ObjectId(req.params.id) }
},
{
$lookup: {
from: "agents",
as: "agent",
let: { "idAgent": "$agent" }, //$agent can be null
pipeline: [
{
$match: {
$expr: {
$eq: ['$_id', "$$idAgent"]
},
}
}
],
}
},
{ $unwind: { path: '$agent', preserveNullAndEmptyArrays: true } },
{
$addFields: {
agent: "$agent", //If $agent is null, it does not output the field agent...
}
}
])
Run Code Online (Sandbox Code Playgroud)
如果在最后一个Stage中,字段$agent为空,则$addFields不会输出该字段。还有其他方法可以做到吗?查找后我只需要代理字段作为对象。谢谢