【问题标题】:Return results by array object value按数组对象值返回结果
【发布时间】:2011-07-10 23:56:16
【问题描述】:

我正在尝试做 MongoDB 的等价物,它应该返回所有名为 Joe Bloggs 的用户,这些用户至少有一个地址,城市被定义为伦敦:

db.users.findOne() {
    name : "Joe Bloggs",
    addresses : [{city: "London"}]
}

使用 Kohana 3 PHP 模块 Mango:https://github.com/Wouterrr/MangoDB

我可以根据顶级对象返回结果,如下所示:

foreach(Mango::factory('users', array(
    'name' => 'Joe Bloggs',
))->load(FALSE) as $user) {
}

但我不知道如何根据数组中的对象返回结果,我尝试了以下变体:

foreach(Mango::factory('users', array(
    'name' => 'Joe Bloggs',
    'addresses' => array('city' => 'London'),
))->load(FALSE) as $user) {
}

和:

foreach(Mango::factory('users', array(
    'name' => 'Joe Bloggs',
    'addresses.$.city' => 'London',
))->load(FALSE) as $user) {
}

我想我真的很接近我只是卡在了最后。

【问题讨论】:

    标签: php mongodb kohana-mangodb


    【解决方案1】:

    我不熟悉您正在使用的库,但从 shell 中您只需这样做:

    db.users.find({"name" : "Joe Bloggs", "addresses.city" : "London"});
    

    所以最有可能的是,您正在寻找的是:

    foreach(Mango::factory('users', array(
        'name' => 'Joe Bloggs',
        'addresses.city' => 'London',
    ))->load(FALSE) as $user) {
    }
    

    【讨论】:

    • 如果结构是user { "name": "Joe Bloggs", "addresses": { "0": { "address": "1 Oxford Street", "city": "London", "state": "London", "postalcode": "W1D", "country": "UK" } } },它不会是来自shell的addresses : [{city: "London"}]
    • 使用 [{city: "London"}] 您将匹配数组的全部内容,即您不会得到匹配,因为嵌入对象中有其他字段。在您在评论中发布的结构中,情况有所不同,因为您实际上使用的不是数组,而是嵌入式对象。
    • 澄清一下-在您发布的结构中,'..."addresses": { "0": { ...' 并不表示数组。 “0”只是一个字符串键,就像任何其他键一样,您可以使用 {“addresses.0.city”:“London”} 进行匹配。但这很可能不是你想要的,我很确定你想要一个真实的、适当的数组。
    • 对不起,应该读到:user { "name": "Joe Bloggs", "addresses": [ { "address": "1 Oxford Street", "city": "London", "state": "London", "postalcode": "W1D", "country": "UK" } ] } RockMongo 出于某种原因用数字键显示它 - 但它实际上是一个数组。 - 'addresses.city' => 'London' 仍在返回所有结果,无论城市如何!
    • 这很奇怪 - 它非常适合我。当您从 shell 执行查询时,您是否看到相同的行为?在我的 shell 中,命令db.users.find({"addresses.city" : "London"}) 仅返回伦敦的文档。如果通过 Mango 进行相同的查询不起作用,恐怕我没有想法。
    猜你喜欢
    • 2017-11-03
    • 2014-10-03
    • 2019-08-04
    • 2018-09-15
    • 2019-05-28
    • 1970-01-01
    • 2015-07-06
    • 2023-01-26
    • 1970-01-01
    相关资源
    最近更新 更多