假设我的mongo集合中有一个文档,如下所示:
{
"_id": 123,
"field_to_prune":
{
"keep_field_1": "some value",
"random_field_1": "some value",
"keep_field_2": "some value",
"random_field_2": "some value",
"random_field_3": "some value"
}
}
Run Code Online (Sandbox Code Playgroud)
我想修剪该文档看起来像这样:
{
"_id": 123,
"field_to_prune":
{
"keep_field_1": "some value",
"keep_field_2": "some value"
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我的问题是我不知道"随机"字段名称是什么.在mongo中,除了几个已知的字段之外,我将如何取消所有字段?
我可以想到几种方法,但我不知道语法..我可以选择所有字段NAMES,然后为每一个取消设置该字段.有点像这样:
[Some query to find all field names under "field_to_prune" for id 123].forEach(function(i) {
var key = "field_to_prune." + i;
print("removing field: " + key);
var mod = {"$unset": {}};
mod["$unset"][key] = "";
db.myCollection.update({ _id: "123" }, mod);
});
Run Code Online (Sandbox Code Playgroud)
我想要做的另一种方法是取消设置字段名称不在我定义的字符串数组中的位置.不知道怎么做.有任何想法吗?
为什么OrderedDict键视图比较顺序不敏感?
>>> from collections import OrderedDict
>>> xy = OrderedDict([('x', None), ('y', None)])
>>> yx = OrderedDict([('y', None), ('x', None)])
>>> xy == yx
False
>>> xy.keys() == yx.keys()
True
Run Code Online (Sandbox Code Playgroud)
OrderedDict键视图应该表现得像OrderedSet,但它的行为相同dict.keys(就像通常一样set).
python2中的"问题"相同:
>>> xy.viewkeys() == yx.viewkeys()
True
Run Code Online (Sandbox Code Playgroud)
它们是不同的类型,(odict_keys是子类dict_keys)
>>> type(xy.keys())
odict_keys
>>> type({}.keys())
dict_keys
Run Code Online (Sandbox Code Playgroud)
并且已经存在一个可以轻易使用的顺序敏感键比较,但它显然仅用作对odict丰富比较的后检查.
这是设计决定还是错误?如果这是一个设计决定,我在哪里可以找到理由的讨论?
如何在pymongo中创建2个字段的索引,一起是唯一的?
我有这个代码:
self.db[self.mongo_collection].create_index("url", unique=True)
Run Code Online (Sandbox Code Playgroud)
但我需要与独特的url和category.
我注意到一个新的$eq操作员发布了MongoDB 3.0,我不明白它的目的.例如,这两个查询完全相同:
db.users.find({age:21})
Run Code Online (Sandbox Code Playgroud)
和
db.users.find({age:{$eq:21}})
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么这是必要的?
在阅读Mongo Save and Update时,我对每篇文章都有点混淆
MongoDB的update()和save()方法用于将文档更新到集合中.update()方法更新现有文档中的值,而save()方法用save()方法中传递的文档替换现有文档.
请让我知道两者的区别.
从Python 3.2开始,logging.Logger.setLevel接受字符串级别,例如'INFO'而不是相应的整数常量.这非常方便,除非您无法以数字方式比较这些级别,而大多数其他日志记录方法只接受整数.如何使用logging包提供的功能将级别字符串转换为数字级别?具体来说,我想要做到这一点:
>>> logging.???('INFO') == logging.INFO
True
Run Code Online (Sandbox Code Playgroud) 在db['TF']我大约有60万条记录。
我需要获取记录的数量。
如果我运行db['TF'].count(),它会立即返回。
如果我运行db['TF'].count_documents({}),那么在我得到结果之前需要很长时间。
但是,该count方法将被弃用。
那么,如何在使用时快速获取数量count_documents呢?有没有我错过的一些论点?
我已经阅读了文档和代码,但没有找到。
非常感谢!
验证插入或更新到MongoDB中的数据的最佳方法是什么?是编写某种服务器执行的Javascript代码进行验证吗?
这是一个典型的文件
{
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 …
mongodb ×8
python ×3
pymongo ×2
python-3.x ×2
logging ×1
mongoose ×1
pymongo-3.x ×1
validation ×1