gpt4 book ai didi

laravel - MongoDB 在数组中搜索嵌套对象

转载 作者:可可西里 更新时间:2023-11-01 10:45:01 26 4
gpt4 key购买 nike

我正在使用 MongoDB 将所有事件存储在我的 Eventbrite 克隆中。所以我有一个名为 events 的集合,然后该集合中的对象由它们的名称和对事件具有 rsvp 的用户数组组成。我可以查询当前用户创建的任何事件,但无法弄清楚如何查询用户创建的事件和回复的事件。

这是我用来尝试获取所有用户事件的编译查询。

events.find({"$and":[{"user_id":"5d335704802df000076bad97"},{"user_id":{"$ne":null}}],"$or":[{"checkins.user_id":"5d335704802df000076bad97"}]},{"typeMap":{"root":"array","document":"array"}})

我正在使用 Laravel MongoDB 插件在 php 中查询我的数据,它看起来像这样

$user->events()->orWhere(function ($query) use ($user){
return $query->where('checkins.user_id',new ObjectID($user->id));
})->get()

事件对象看起来像这样:

{
"name": "test",
"user_id": "1"
"rsvp": [
{"user_id": "12"}
]
}

用户可以回复不属于他们自己的其他事件。

最佳答案

您需要一个 $or 过滤器和 $elemMatch 来获取属于给定用户的事件或他们已回复的事件。

db.events.find({
"$or": [
{
"user_id": "5d33e732e1ea9d0d6834ef3d"
},
{
"rsvp": {
"$elemMatch": {
"user_id": "5d33e732e1ea9d0d6834ef3d"
}
}
}
]
})

不幸的是,我无法帮助您处理 Laravel 版本的查询。如果有帮助,下面是生成上述 mongo 查询的 c# 代码。

using MongoDB.Entities;
using System.Linq;

namespace StackOverflow
{
public class Program
{
public class user : Entity
{
public string name { get; set; }
}

public class Event : Entity
{
public string name { get; set; }
public string user_id { get; set; }
public rsvp[] rsvp { get; set; }
}

public class rsvp
{
public string user_id { get; set; }
}

private static void Main(string[] args)
{
new DB("test");

var mike = new user { name = "mike" };
var dave = new user { name = "dave" };
mike.Save();
dave.Save();

(new[] {
new Event
{
name = "mike's event",
user_id = mike.ID,
rsvp = new[]
{
new rsvp { user_id = dave.ID }
}
},
new Event
{
name = "dave's event",
user_id = dave.ID,
rsvp = new[]
{
new rsvp { user_id = mike.ID }
}
}
}).Save();

var result = DB.Find<Event>()
.Many(e =>
e.user_id == mike.ID ||
e.rsvp.Any(r => r.user_id == mike.ID));
}
}
}

关于laravel - MongoDB 在数组中搜索嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57129393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com