MongoEngine - Query - How to check if a ListField is empty or not set
Asked Answered
A

3

9

how do I check if an ListField() attribute of a Mongo Class is not set or empty?

Thanks!

Aurify answered 8/8, 2012 at 15:27 Comment(0)
A
15

Hi you can use $exists and $size:

import unittest
from mongoengine import *

class Test(unittest.TestCase):

    def setUp(self):
        conn = connect(db='mongoenginetest')

    def test_list_exists_or_has_size(self):

        class Post(Document):
            title = StringField(required=True)
            tags = ListField(StringField())

        Post.drop_collection()

        Post(title="Hello Stackoverflow").save()
        Post(title="Hello twitter", tags=[]).save()
        Post(title="Hello world", tags=['post', 'blog']).save()

        self.assertEqual(2, Post.objects(
                                Q(tags__exists=False) |
                                Q(tags__size=0)).count())
Almost answered 13/8, 2012 at 16:49 Comment(1)
sounds good! but its "exists" and not "exist" in the final query, isn't it? I'm not allowed to do a change with less than 6 chars...Aurify
G
4

If you were looking for the reverse question (check if a list contains at least an element which implies that it also exists), here is how you can do it using a query dict for a change:

query = {}
query['tags__exists'] = True
query['tags__not__size'] = 0
for post in Post.objects(**query):
    print(post)

As per the MongoEngine documentation, the not operator can be used to negate a standard check as long as it precedes the query operator.

Gestation answered 7/10, 2019 at 16:48 Comment(0)
L
-1

Not sure entirely sure if this is what you mean by empty or not set ListField this:

from mongoengine import *

connect('tumblelog')


class Post(Document):
    title = StringField(required=True)
    tags = ListField(StringField())


post1 = Post(title='Fun with MongoEngine', tags=['mongodb', 'mongoengine'])
post1.save()

for post in Post.objects:
    print post.title
    if not post.tags:
        print '-post has no tags'
    else:
        print post.tags

This will output:

Fun with MongoEngine
[u'mongodb', u'mongoengine']
Fun with MongoEngine no tags
-post has no tags
Lasso answered 13/8, 2012 at 15:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.