我有一个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)
但是,它仅更新每个文档中第一个匹配的数组元素.(这是$的定义行为- 位置运算符.)
如何更新所有匹配的数组元素?
每天,我收到一份文件(更新).我想要做的是插入每个尚不存在的项目.
我正在使用Python驱动程序(pymongo).
我目前做的是(伪代码):
for each document in update:
existing_document = collection.find_one(document)
if not existing_document:
document['insertion_date'] = now
else:
document = existing_document
document['last_update_date'] = now
my_collection.save(document)
Run Code Online (Sandbox Code Playgroud)
我的问题是它非常慢(少于100 000条记录需要40分钟,而且我在更新中有数百万条记录).我很确定有内置的东西可以做到这一点,但更新()的文件是mmmhhh ....有点简洁....(http://www.mongodb.org/display/DOCS/Updating)
有人可以建议如何更快地做到这一点?
我想定义一个$ project聚合阶段,我可以指示它添加一个新字段并包含所有现有字段,而不必列出所有现有字段.
我的文档看起来像这样,有很多字段:
{
obj: {
obj_field1: "hi",
obj_field2: "hi2"
},
field1: "a",
field2: "b",
...
field26: "z"
}
Run Code Online (Sandbox Code Playgroud)
我想做一个像这样的聚合操作:
[
{
$project: {
custom_field: "$obj.obj_field1",
//the next part is that I don't want to do
field1: 1,
field2: 1,
...
field26: 1
}
},
... //group, match, and whatever...
]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以使用类似"包含所有字段"的关键字,还是以其他方式避免必须单独列出每个字段?
我有一个Email有sent_at日期字段的文件:
{
'sent_at': Date( 1336776254000 )
}
Run Code Online (Sandbox Code Playgroud)
如果Email尚未发送,则该sent_at字段为空或不存在.
我需要得到所有已发送/未发送的计数Emails.我一直试图找出查询此信息的正确方法.我认为这是获得发送计数的正确方法:
db.emails.count({sent_at: {$ne: null}})
Run Code Online (Sandbox Code Playgroud)
但是我应该如何计算未发送的数量呢?
我想知道一个集合中的最新记录.怎么做?
注意:我知道以下命令行查询有效:
1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson);
2. db.test.find().skip(db.test.count()-1).forEach(printjson)
Run Code Online (Sandbox Code Playgroud)
其中idate添加了时间戳.
问题是收集是时候收回数据的时间越长,我的"测试"集合真的非常庞大.我需要一个具有恒定时间响应的查询.
如果有任何更好的mongodb命令行查询,请告诉我.
是否存在用于计算字段在DB中包含多少个不同值的查询.
我有一个国家的领域,有8种国家价值观(西班牙,英格兰,法国等...)
如果有人在新国家/地区添加了更多文档,我希望查询返回9.
是否有更容易的方式然后分组和计数?
我使用pymongo的SQL'Like'运算符,
db.test.find({'c':{'$regex':'ttt'}})
Run Code Online (Sandbox Code Playgroud)
但是我如何使用'不喜欢'运算符?
我试过了
db.test.find({'c':{'$not':{'$regex':'ttt'}})
Run Code Online (Sandbox Code Playgroud) 在一个ObjectIds数组而不仅仅是一个ObjectId的字段上执行$ lookup的语法是什么?
示例订单文档:
{
_id: ObjectId("..."),
products: [
ObjectId("..<Car ObjectId>.."),
ObjectId("..<Bike ObjectId>..")
]
}
Run Code Online (Sandbox Code Playgroud)
不工作查询:
db.orders.aggregate([
{
$lookup:
{
from: "products",
localField: "products",
foreignField: "_id",
as: "productObjects"
}
}
])
Run Code Online (Sandbox Code Playgroud)
期望的结果
{
_id: ObjectId("..."),
products: [
ObjectId("..<Car ObjectId>.."),
ObjectId("..<Bike ObjectId>..")
],
productObjects: [
{<Car Object>},
{<Bike Object>}
],
}
Run Code Online (Sandbox Code Playgroud) 我有像这样的子文档数组
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 1
},
{
"a" : 2
},
{
"a" : 3
},
{
"a" : 4
},
{
"a" : 5
}
]
}
Run Code Online (Sandbox Code Playgroud)
我可以过滤子文档> 3
我期待下面的结果
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 4
},
{
"a" : 5
}
]
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用$elemMatch但返回数组中的第一个匹配元素
我的查询:
db.test.find( { _id" : ObjectId("512e28984815cbfcb21646a7") }, {
list: {
$elemMatch:
{ a: { $gt:3 }
}
}
} ) …Run Code Online (Sandbox Code Playgroud) 使用代码:
all_reviews = db_handle.find().sort('reviewDate', pymongo.ASCENDING)
print all_reviews.count()
print all_reviews[0]
print all_reviews[2000000]
Run Code Online (Sandbox Code Playgroud)
计数打印2043484,然后打印all_reviews[0].
但是在打印时all_reviews[2000000],我收到错误:
pymongo.errors.OperationFailure:数据库错误:运行程序错误:溢出排序阶段缓冲数据使用量33554495字节超过内部限制33554432字节
我该如何处理?