12

pymongo尝试查询和元素时向我抛出错误tags

db.users.find({"pseudo":"alucaard"}).distinct("produit_up")
Out[1]: 
[{u'abus': 0,
  u'avctype': u'image/jpeg',
  u'date': u'2012-09-15',
  u'description': u'le fameux portable solide',
  u'id': u'alucaard134766932677',
  u'namep': u'nokia 3310',
  u'nombre': 1,
  u'orientation': u'portrait',
  u'photo': ObjectId('5053cd4e3a5f3a0990da8a61'),
  u'prix': 1000,
  u'tags': [u'solide', u'le', u'fameux', u'portable'],
  u'vendu': False}]

list(db.users.find({"solide":{"$in":{"document_up.tags"}}}))

Traceback (most recent call last):
 File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2746, in  run_code exec code_obj in self.user_global_ns, self.user_ns
File "<ipython-input-1-8dff98261d7a>", line 1, in <module>
list(db.users.find({"solide":{"$in":{"document_up.tags"}}}))
File "C:\Python27\lib\site-packages\pymongo\cursor.py", line 778, in next
if len(self.__data) or self._refresh():
File "C:\Python27\lib\site-packages\pymongo\cursor.py", line 729, in _refresh
self.__uuid_subtype))
InvalidDocument: Cannot encode object: set(['document_up.tags'])

注意:对于 pymongo 用户来说只是一个技巧,如果您的用户的文本大小有限,只需使用集合将其转换,将集合转换为列表:例如:

phrase = "hi you, how are you, am i using this"
  1. 第一步:删除逗号或点以避免正则表达式搜索。
  2. 第二,用于phrase.split()分词。
  3. 将此添加到 aset以避免重复的单词。
  4. 将集合转换为list
  5. 制作一个包含一些将从列表中删除的单词的字典是个好主意,例如“how”、“you”、“me”……但它会进行大量计算。

希望这个想法会有所帮助。

4

2 回答 2

37

你的查询是错误的。尝试更接近:

list(db.users.find({"document_up.tags":{"$in":["solide"]}}))
于 2012-09-15T13:52:12.917 回答
0

9 年后,我在寻找类似答案时偶然发现了这个页面。由于唯一的其他答案似乎很可疑,尽管有投票,我将这个答案添加为其他访问者的资源。

这个参考似乎是合适的:https ://docs.mongodb.com/manual/tutorial/query-arrays/#query-an-array-for-an-element

要查询数组字段是否包含至少一个具有指定值的元素,请使用过滤器{ <field>: <value> }where <value>is the element value。

以下示例查询所有文档,其中 tags 是一个包含字符串“red”作为其元素之一的数组: cursor = db.inventory.find({"tags": "red"})

明确地说,您可以使用list(db.users.find({"document_up.tags":"solide"}))当前,因为尝试将单个值与数组匹配会隐式返回包含该值(至少一个实例)的数组的记录。该参考资料对特定案例进行了非常有用的详细说明。

于 2021-07-09T00:33:21.240 回答