【问题标题】:Mongoengine, retriving only some of a MapFieldMongoengine,只检索一些 MapField
【发布时间】:2012-05-27 14:40:44
【问题描述】:

例如..在MongoDB中..

> db.test.findOne({}, {'mapField.FREE':1})
{
    "_id" : ObjectId("4fb7b248c450190a2000006a"),
    "mapField" : {
            "BOXFLUX" : {
                    "a" : "f",
            }
    }
}

'mapField' 字段由 Mongoengine 的 MapField 组成。 并且“mapField”字段有键和数据的日志..但我只检索到“BOXFLUX”..

此查询在 MongoEngine 中不起作用.... 比如……

BoxfluxDocument.objects( ~~ querying ~~ ).only('mapField.BOXFLUX')

如你所见.. only('mapField.BOXFLUX') 或只有 only('mapField__BOXFLUX') 不起作用。 它检索所有“mapField”数据,包括“BOXFLUX”一个..

如何只检索 MapField 的一个字段???

【问题讨论】:

    标签: python django mongodb pymongo mongoengine


    【解决方案1】:

    我看到有一张票:https://github.com/hmarr/mongoengine/issues/508

    适用于我这里有一个示例测试用例:

    def test_only_with_mapfields(self):
    
        class BlogPost(Document):
            content = StringField()
            author = MapField(field=StringField())
    
        BlogPost.drop_collection()
    
        post = BlogPost(content='Had a good coffee today...', 
                        author={'name': "Ross", "age": "20"}).save()
    
        obj = BlogPost.objects.only('author__name',).get()
    
        self.assertEquals(obj.author['name'], "Ross")
        self.assertEquals(obj.author.get("age", None), None)
    

    【讨论】:

      【解决方案2】:

      我发现我的错了!我用了两次only

      例如:

      BlogPost.objects.only('author').only('author__name') 
      

      我花了一整天的时间找出 Mongoengine 有什么问题。

      所以我的错误结论是:

      BlogPost.objects()._collection.find_one(~~ filtering query ~~, {'author.'+ name:1})
      

      但正如您所知,这只是原始数据,而不是 mongoengine 查询。

      在这段代码之后,我无法运行任何mongoengine 方法。

      就我而言,我应该根据某些条件进行查询。

      因此,'only' 方法会覆盖之前编写的 'only' 方法会很棒。在我看来。

      我希望这个功能将与下一个版本集成。现在,我必须编写重复的代码:

      不是这个代码:

      query = BlogPost.objects()
      query( query~~).only('author')
      if name:
          query = query.only('author__'+name)
      

      这段代码:

      query = BlogPost.objects()
      query( query~~).only('author')
      if name:
          query = BlogPost.objects().only('author__'+name)
      

      所以我认为第二个看起来比第一个更脏。

      当然,第一个代码会显示所有数据 使用only('author') 而不是only('author__name')

      【讨论】:

        【解决方案3】:

        试试这个:

        query = BlogPost.objects({your: query})
        if name:
            query = query.only('author__'+name)
        else:
            query = query.only('author')
        

        【讨论】:

          猜你喜欢
          • 2017-09-11
          • 1970-01-01
          • 2020-12-18
          • 1970-01-01
          • 2022-01-04
          • 1970-01-01
          • 1970-01-01
          • 2013-04-25
          • 1970-01-01
          相关资源
          最近更新 更多