在我的收藏中,每个文档都有2个日期,修改和同步.我想找到那些修改>同步或同步不存在的那些.
我试过了
{'modified': { $gt : 'sync' }}
Run Code Online (Sandbox Code Playgroud)
但它没有表现出我的预期.有任何想法吗?
谢谢
datetime mongodb node.js mongodb-query aggregation-framework
这是一个典型的文件
{
title : 'someTitle',
places : [{name : 'someName', location : 'someLocation'}, {name ...}]
}
Run Code Online (Sandbox Code Playgroud)
我有以下查询
var qs = {title : 'someTitle', places : {$elemMatch : {name : 'someName' } } };
Run Code Online (Sandbox Code Playgroud)
我选择一个与标题匹配的文档,其中包含名称等于'someName'的'places'数组中的文档条目.但问题是places数组中的条目是大文档,我只需要该文档中的几个字段.我尝试像这样投射字段,但它没有用.
var projection = {'places.$.name': 1, 'places.$.location' : 1};
Run Code Online (Sandbox Code Playgroud)
应该返回一个包含仅包含'name'和'location'属性的文档的数组.
我收到以下错误
Can't canonicalize query: BadValue Cannot specify more than one positional proj. per query.
Run Code Online (Sandbox Code Playgroud)
要清楚,我想在没有聚合框架的情况下实现这一目标
现在,在$ filter数组聚合运算符中不可能使用$ in运算符.
假设这是文档架构:
{
_id: 1,
users: [
{
_id: 'a',
accounts: ['x', 'y', 'z']
},
{
_id: 'b',
accounts: ['j','k','l']
}
]
}
Run Code Online (Sandbox Code Playgroud)
我希望,使用aggregate,users根据数组的内容获取带有过滤数组的文档accounts.
如果在$in将与合作$filter运营商,我希望它看起来像这样:
db.test.aggregate([
{
$project: {
'filtered_users': {
$filter: {
input: '$users',
as: 'user',
cond: {
$in: ['$$user.accounts', ['x']]
}
}
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
和返回的filtered_users只有第一个用户,因为X是在他的账户.
但是,正如我所说,这不起作用,我得到错误:
"无效的运营商'$ in'"
因为$filter运营商不支持它.
现在我知道我可以$unwind …
查询返回元素在其集合中的放置顺序,忽略初始数组的顺序。这会影响我们系统的功能。是否有任何额外的命令可以将其按正确的顺序排列?有没有可用的解决方法?
下面是一个简单的例子:
Collection1 文档
{
"_id":ObjectId("5c781752176c512f180048e3"),
"Name":"Pedro",
"Classes":[
{"ID": ObjectId("5c7af2b2f6f6e47c9060d7ce") },
{"ID": ObjectId("5c7af2bcf6f6e47c9060d7cf") },
{"ID": ObjectId("5c7af2aaf6f6e47c9060d7cd") }
]
}
Run Code Online (Sandbox Code Playgroud)
Collection2 文件
{
"_id":ObjectId("5c7af2aaf6f6e47c9060d7cd"),
"variable1":"A"
},
{
"_id": ObjectId("5c7af2b2f6f6e47c9060d7ce"),
"variable1":"B"
},
{
"_id": ObjectId("5c7af2bcf6f6e47c9060d7cf"),
"variable1":"C"
}
Run Code Online (Sandbox Code Playgroud)
查询:
aggregate(
pipeline = '[
{"$match": {"_id": {"$oid": "5c781752176c512f180048e3"}}},
{"$lookup": {"from": "collection2", "localField": "Classes.ID", "foreignField": "_id", "as": "Collection2_doc"}}
]'
)
Run Code Online (Sandbox Code Playgroud)
返回:
结果顺序:
[
{
"_id":ObjectId("5c7af2aaf6f6e47c9060d7cd"),
"variable1":"A"
},
{
"_id": ObjectId("5c7af2b2f6f6e47c9060d7ce"),
"variable1":"B"
},
{
"_id": ObjectId("5c7af2bcf6f6e47c9060d7cf"),
"variable1":"C"
}
]
Run Code Online (Sandbox Code Playgroud)
预期顺序(第一个文档数组顺序):
[
{
"_id": ObjectId("5c7af2b2f6f6e47c9060d7ce"),
"variable1":"B"
}, …Run Code Online (Sandbox Code Playgroud) 请考虑以下示例:
db.article.aggregate(
{ $group : {
_id : "$author",
docsPerAuthor : { $sum : 1 },
viewsPerAuthor : { $sum : "$pageViews" }
}}
);
Run Code Online (Sandbox Code Playgroud)
这个由作者字段分组并计算两个字段.
我有$ author = FirstName_LastName的值.现在不是按$ author分组,而是希望由共享相同LastName的所有作者进行分组.
我试过$ regex在'_'后按所有匹配的字符串分组
$author.match(/_[a-zA-Z0-9]+$/)
db.article.aggregate(
{ $group : {
_id : "$author".match(/_[a-zA-Z0-9]+$/),
docsPerAuthor : { $sum : 1 },
viewsPerAuthor : { $sum : "$pageViews" }
}}
);
also tried the following:
db.article.aggregate(
{ $group : {
_id : {$author: {$regex: /_[a-zA-Z0-9]+$/}},
docsPerAuthor : { $sum : 1 },
viewsPerAuthor …Run Code Online (Sandbox Code Playgroud) 我想获得每个电台的最后一个文件以及所有其他字段:
{
"_id" : ObjectId("535f5d074f075c37fff4cc74"),
"station" : "OR",
"t" : 86,
"dt" : ISODate("2014-04-29T08:02:57.165Z")
}
{
"_id" : ObjectId("535f5d114f075c37fff4cc75"),
"station" : "OR",
"t" : 82,
"dt" : ISODate("2014-04-29T08:02:57.165Z")
}
{
"_id" : ObjectId("535f5d364f075c37fff4cc76"),
"station" : "WA",
"t" : 79,
"dt" : ISODate("2014-04-29T08:02:57.165Z")
}
Run Code Online (Sandbox Code Playgroud)
我需要为每站最新的dt设备和站点.使用聚合框架:
db.temperature.aggregate([{$sort:{"dt":1}},{$group:{"_id":"$station", result:{$last:"$dt"}, t:{$last:"$t"}}}])
Run Code Online (Sandbox Code Playgroud)
回报
{
"result" : [
{
"_id" : "WA",
"result" : ISODate("2014-04-29T08:02:57.165Z"),
"t" : 79
},
{
"_id" : "OR",
"result" : ISODate("2014-04-29T08:02:57.165Z"),
"t" : 82
}
],
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud)
这是最有效的方法吗? …
我有一个四阶段聚合查询,形式为匹配 - >组 - >项目 - >排序.聚合工作正常并生成如下所示的数组.
{ count: 48, ISP: 'LEASEWEB USA', percentRisky: 100 },
{ count: 51, ISP: 'ARETI INTERNET LTD', percentRisky: 100 },
{ count: 82, ISP: 'TINET SPA', percentRisky: 100 },
{ count: 109, ISP: 'GIGLINX', percentRisky: 100 },
{ count: 142, ISP: 'EGIHOSTING', percentRisky: 100 },
{ count: 857, ISP: 'VERSAWEB, LLC', percentRisky: 100 }
Run Code Online (Sandbox Code Playgroud)
下面是我的聚合查询.有没有办法让我只显示'count'字段大于500的结果?我试过加入项目阶段没有运气.
{ $match : { //match to documents which are from all clients, from last three days, and scored
org …Run Code Online (Sandbox Code Playgroud) 我有一个类似的mongo文件
{ "_id" : 12, "location" : [ "Kannur","Hyderabad","Chennai","Bengaluru"] }
{ "_id" : 13, "location" : [ "Hyderabad","Chennai","Mysore","Ballary"] }
Run Code Online (Sandbox Code Playgroud)
从这里我如何获得位置聚合(不同的区域计数).就像是
Hyderabad 2,
Kannur 1,
Chennai 2,
Bengaluru 1,
Mysore 1,
Ballary 1
Run Code Online (Sandbox Code Playgroud) 我的taxon集合中有以下架构:
{
"_id": 1,
"na": [ "root_1",
"root_2",
"root_3" ],
"pa": 1
},{
"_id": 2,
"na": [ "name_1",
"name_2",
"name_3"],
"pa": 1
},{
"_id": 4,
"na": [ "otherName_1",
"otherName_2",
"otherName_3"],
"pa": 2
}
Run Code Online (Sandbox Code Playgroud)
每个文档都由父字段与另一个文档相关联,该字段对应于_id其父项.
我想执行递归搜索以获得以下结果:
{ "_id": 4,
"nameList": [ "otherName_1",
"name_1",
"root_1"]
}
Run Code Online (Sandbox Code Playgroud)
从某个文件中_id获取na每个父项的数组的第一项,直到_id: 1达到 文档为止
我目前通过执行X查询得到这个结果(一个通过父文档,例如这里有3个),但我很确定这可以使用单个查询来实现.我已经看过新的$ graphLookup操作符了,但无法用它来解决问题...
是否可以使用MongoDB 3.4.1在单个查询中实现此目的?
编辑
我每次都会运行50个文档,因此最佳解决方案是将所有内容组合在一个查询中
例如,它看起来像
var listId = [ 4, 128, 553, 2728, ...];
var cursor = db.taxon.aggregate([
{$match: …Run Code Online (Sandbox Code Playgroud) 我正在尝试查找符合我条件的邻域 - boundries多边形与帖子的坐标相交但我无法做到 - 无法使用let我的pipeline $match
邮政实体的例子:
{
_id: ObjectId,
...,
location: {
...,
coordinates: {
type: 'Point',
coordinates: [number, number]
}
}
};
Run Code Online (Sandbox Code Playgroud)
邻域实体的例子:
{
_id: ObjectId,
...,
boundries: {
type: 'Polygon',
coordinates: [ [ [number, number], [number, number], [number, number], [number, number], [number, number] ] ]
}
};
Run Code Online (Sandbox Code Playgroud)
查询示例我试图"修复":
db.posts.aggregate([
{ $match: { _id: ObjectId('5a562e62100338001218dffa') } },
{
$lookup: {
from: 'neighborhoods',
let: { postCoordinates: '$location.coordinates.coordinates' },
pipeline: [
{
$match: {
boundries: { …Run Code Online (Sandbox Code Playgroud)