这是我的文档结构:
{
"_id" : ObjectId("50dcd7ff4de274a2c4a31df0"),
"seq_name" : "169:D18M6ACXX:1:1111:17898:82486:GTGACA_10",
"raw_seq" : "TTGACCTGAGGAGACGGTGACCAGGGTTCCCTGGCCCCAGTAGTCAACGGGAGTTAGACTTCTCGCACAGTAATAAACAGCCGTGTCCTCGGCTCTCAGGCTGTTCATTTGCAGA",
"seq_aa" : "LQMNSLRAEDTAVYYCARSLTPVDYWGQGTLVTVSSGQ",
"cdr3_seq" : "GCGAGAAGTCTAACTCCCGTTGACTAC",
"cdr3_seq_aa" : "ARSLTPVDY",
"cdr3_seq_len" : 27,
"cdr3_seq_aa_len" : 9,
"vg" : "IGHV3-48*03",
"dg" : "IGHD3-10*02R",
"jg" : "IGHJ4*02",
"donor" : 10
}
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢 MongoDB 框架,但是我在使用这个分组管道时遇到了麻烦,因为我还不能 $out 到另一个集合。我可以做这个多分组管道。
db.collection.aggregate({$match:{cdr3_seq_aa_len:{$gt:3}},
{$group:{_id:$cdr3_seq_aa,other_set:{$addToSet:$cdr3_seq_aa_len}}},
{$group:{_id:$other_set,sum:{$sum:1}}})
Run Code Online (Sandbox Code Playgroud)
这给了我按长度分组的唯一$cdr3_seq_aa 的数量。
{ id:40, sum:1002031,
id:41, sum:1949402,....
Run Code Online (Sandbox Code Playgroud)
然而,我想做的第一个手术是按捐赠者分组。所以我可以先知道每个捐助者之间有多少个唯一的 cdr3_seq_aa 字符串。然后我想按长度对它进行分组并计算有多少字符串与长度分组。
我想知道是否有办法使用 Mongoengine 在 MongoDB 集合的列中获得最大值。是否可以?
我的用例相当简单:我在 mongodb 中有一组文档,地理坐标指定为 GeoJSON Point。
我想找到这个集合的边界框,定义为 lat min、long min、lat max、long max。
这些文件具有以下结构:
{
"_id": ObjectId("538ed354b83897b4418b4567"),
"name": "example point",
"description": "",
"location": {
"type": "Point",
"coordinates": [
24.501885327447624,
42.228924279974158
]
},
"status": "1",
"type": "image"
}
Run Code Online (Sandbox Code Playgroud)
经过大量搜索和反复试验,我被困在如何继续。
我发现了一些很好的工作方法,它们适用于具有键/值对的子文档(数组),但到目前为止我还没有找到任何适用于普通数组(例如 GeoJSON 坐标对)的方法。
使用聚合时,我面临无法从 GeoJSON 点提取 X、Y 坐标的问题(尝试使用$slice: [0,1]和$slice: [1,1]但这似乎在$project管道中不起作用)。放松似乎也不是正确的方法。
Map/reduce 对于 RDMS 中真正的基本查询来说看起来有点矫枉过正。
我最好的方法是什么(最新的 mongodb 版本 2.6.3)?
我有一个用 node.js mongodb 和 mongoose 实现的地理数据api。我想用两个条件查询我的数据。
首先,我使用 geoNear 来获取给定半径内的所有位置,这很好用。其次,我想按其类型进一步过滤位置。
这是我的架构:
var GeoLocationSchema = new Schema({
name: String,
type: String,
loc: {
type: {
type: String,
required: true,
enum: ["Point", "LineString", "Polygon"],
default: "Point"
},
coordinates: [Number]
}
});
// ensure the geo location uses 2dsphere
GeoLocationSchema.index({ loc : "2dsphere" });
Run Code Online (Sandbox Code Playgroud)
这是我的 geoNear 查询:
router.route("/locations/near/:lng/:lat/:type/:max")
// get locations near the get params
.get(function(req, res) {
// setup geoJson for query
var geoJson = {};
geoJson.type = "Point";
geoJson.coordinates = [parseFloat(req.params.lng), parseFloat(req.params.lat)]; …Run Code Online (Sandbox Code Playgroud) 问题
查询工作正常但没有限制和跳过,它一次获取所有记录。
请建议我做错了什么。
MongoDB 集合
{
"_id" : ObjectId("559666c4e4b07a176940c94f"),
"postId" : "559542b1e4b0108c9b6f390e",
"user" : {
"userId" : "5596598ce4b07a176940c943",
"displayName" : "User1",
"username" : "user1",
"image" : ""
},
"postFor" : {
"type": "none",
"typeId" : ""
},
"actionType" : "like",
"isActive" : 1,
"createdDate" : ISODate("2015-07-03T10:41:07.575Z"),
"updatedDate" : ISODate("2015-07-03T10:41:07.575Z")
}
Run Code Online (Sandbox Code Playgroud)
Java驱动查询
Aggregation aggregation = newAggregation(
match(Criteria.where("isActive").is(1).and("user.userId").in(feedUsers)),
group("postId")
.last("postId").as("postId")
.last("postFor").as("postFor")
.last("actionType").as("actionType")
.last("isActive").as("isActive")
.last("user").as("user")
.last("createdDate").as("createdDate")
.last("updatedDate").as("updatedDate"),
sort(Sort.Direction.DESC, "createdDate")
);
aggregation.skip( skip );
aggregation.limit( limit );
AggregationResults<UserFeedAggregation> groupResults =
mongoOps.aggregate(aggregation, SocialActionsTrail.class, UserFeedAggregation.class);
return …Run Code Online (Sandbox Code Playgroud) 我试图在MongoDB聚合管道的$ group阶段有条件地将字段推入数组.
基本上我有包含用户名的文档,以及他们执行的操作数组.
如果我将用户操作分组如下:
{ $group: { _id: { "name": "$user.name" }, "actions": { $push: $action"} } }
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
[{
"_id": {
"name": "Bob"
},
"actions": ["add", "wait", "subtract"]
}, {
"_id": {
"name": "Susan"
},
"actions": ["add"]
}, {
"_id": {
"name": "Susan"
},
"actions": ["add, subtract"]
}]
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在的想法是将actions数组组合在一起,以查看哪组用户操作最受欢迎.问题是我需要在考虑组之前删除"等待"操作.因此,结果应该是这样的,考虑到在分组中不应该考虑"wait"元素:
[{
"_id": ["add"],
"total": 1
}, {
"_id": ["add", "subtract"],
"total": 2
}]
Run Code Online (Sandbox Code Playgroud)
如果我添加这个$ group阶段:
{ $group : { _id : "$actions", total: { $sum: 1} }} …Run Code Online (Sandbox Code Playgroud) 我的收藏包含以下文件。我想使用聚合来计算内部有多少客户,但我遇到了一些问题。我可以得到总行,但不能得到总(唯一)客户。
[{
_id: "n001",
channel: "Kalipare",
trans: {
_id: "trans001",
customerID: "customerCXLA93",
customerName: "Kalipare Fried Chicked"
}
}, {
_id: "n002",
channel: "Kalipare",
trans: {
_id: "trans002",
customerID: "customerCXLA93",
customerName: "Kalipare Fried Chicked"
}
}, {
_id: "n003",
channel: "Kalipare",
trans: {
_id: "trans003",
customerID: "customerPWR293",
customerName: "Kalipare Papabun"
}
}, {
_id: "n004",
channel: "Kalipare",
trans: {
_id: "trans004",
customerID: "customerPWR293",
customerName: "Kalipare Papabun"
}
}, {
_id: "n005",
channel: "Tumpakrejo",
trans: {
_id: "trans005",
customerID: "customerPWR293",
customerName: "Tumpakrejo …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行一个 mongodb 查询,对于请求的每一天,它将返回不同列中唯一值的计数。例如,对于六月,查询将返回日期以及该日期 b 列中不同值的计数。任何人都知道如何做到这一点我尝试了几种不同的方法但没有运气
下面是几个示例文档,以及输出应该是什么
{
"_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
"IP" : "123.123.123.123",
"datetime" : ISODate("2016-07-20T10:04:56-05:00")
},
{
"_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
"IP" : "110.123.1.2",
"datetime" : ISODate("2016-07-20T10:04:56-05:00"),
}
Run Code Online (Sandbox Code Playgroud)
输出应该是
{
"date":"2016-07-20",
count:2 -- this is distinct number of IPs for the date above
}
Run Code Online (Sandbox Code Playgroud) 我在我的收藏中分配了人物,状态就像下面一样
[
{"ASSIGN_ID": "583f84bce58725f76b322398", "STATUS": 1},
{"ASSIGN_ID": "583f84bce58725f76b322398","STATUS": 4},
{"ASSIGN_ID": "583f84bce58725f76b322398","STATUS": 4},
{"ASSIGN_ID": "583f84bce58725f76b322398","STATUS": 3},
{"ASSIGN_ID": "583f84bce58725f76b322311","STATUS": 1},
{"ASSIGN_ID": "583f84bce58725f76b322311","STATUS": 3},
{"ASSIGN_ID": "583f84bce58725f76b322322","STATUS": 1},
{"ASSIGN_ID": "583f84bce58725f76b322322","STATUS": 4}
]
Run Code Online (Sandbox Code Playgroud)
我想通过ASSIGN_ID对这些数据进行分组,并通过每个STATUS的STATUS计数对其进行分组,如下所示.
[
{
"ASSIGN_ID":"583f84bce58725f76b322398",
"STATUS_GROUP":[
{
"STATUS":1,
"COUNT":1
},
{
"STATUS":3,
"COUNT":1
},
{
"STATUS":4,
"COUNT":2
}
]
},
{
"ASSIGN_ID":"583f84bce58725f76b322311",
"STATUS_GROUP":[
{
"STATUS":1,
"COUNT":1
},
{
"STATUS":3,
"COUNT":1
}
]
},
{
"ASSIGN_ID":"583f84bce58725f76b322322",
"STATUS_GROUP":[
{
"STATUS":1,
"COUNT":1
},
{
"STATUS":4,
"COUNT":1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行$graphLookup类似以下所示的示例:
目的是在给定特定记录($match在此处有注释)的情况下,通过immediateAncestors属性检索其完整的“路径” 。如您所见,这没有发生。
我$convert在这里介绍了_idfrom的处理方式,因为string相信可以与_idfrom immediateAncestors记录列表(是string)“匹配” 。
因此,我确实使用不同的数据运行了另一个测试(不ObjectId涉及):
db.nodos.insert({"id":5,"name":"cinco","children":[{"id":4}]})
db.nodos.insert({"id":4,"name":"quatro","ancestors":[{"id":5}],"children":[{"id":3}]})
db.nodos.insert({"id":6,"name":"seis","children":[{"id":3}]})
db.nodos.insert({"id":1,"name":"um","children":[{"id":2}]})
db.nodos.insert({"id":2,"name":"dois","ancestors":[{"id":1}],"children":[{"id":3}]})
db.nodos.insert({"id":3,"name":"três","ancestors":[{"id":2},{"id":4},{"id":6}]})
db.nodos.insert({"id":7,"name":"sete","children":[{"id":5}]})
Run Code Online (Sandbox Code Playgroud)
和查询:
db.nodos.aggregate( [
{ $match: { "id": 3 } },
{ $graphLookup: {
from: "nodos",
startWith: "$ancestors.id",
connectFromField: "ancestors.id",
connectToField: "id",
as: "ANCESTORS_FROM_BEGINNING"
}
},
{ $project: {
"name": 1,
"id": 1,
"ANCESTORS_FROM_BEGINNING": "$ANCESTORS_FROM_BEGINNING.id"
}
}
] )
Run Code Online (Sandbox Code Playgroud)
...输出了我期望的结果(这5条记录直接或间接与id3 条记录相关):
{
"_id" : ObjectId("5afe270fb4719112b613f1b4"),
"id" …Run Code Online (Sandbox Code Playgroud) mongodb ×10
mongoose ×2
node.js ×2
database ×1
geolocation ×1
geospatial ×1
java ×1
javascript ×1
mongoengine ×1
python ×1