- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一些包含产品的类别,而您可以将产品添加到类别中。这是多对多关系,而产品不知道它们与类别的关系(因为它仅保存在类别中)。我将首先发布我的设置,然后发布出现问题的查询。
/** @ODM\Document */
class Category
{
/** @ODM\Id */
private $id;
/** @ODM\String */
private $name;
/** @ODM\ReferenceMany(targetDocument="Product", inversedBy="category") */
private $products;
public function setProducts($products)
{
$this->products = $products;
}
}
/** @ODM\Document */
class Product
{
/** @ODM\Id */
private $id;
/** @ODM\String */
private $name;
/** @ODM\Float */
private $price;
/** @ODM\ReferenceMany(targetDocument="Category", mappedBy="products") */
private $category;
}
为了得到一些数据,我是这样创建的:
$p1 = new Documents\Product();
$p1->setName('p1');
$p1->setPrice(1.99);
$p2 = new Documents\Product();
$p2->setName('p2');
$p2->setPrice(3.99);
$c1 = new Documents\Category();
$c1->setName('category1');
$c1->setProducts(array($p1, $p2));
$c2 = new Documents\Category();
$c2->setName('category2');
$c2->setProducts(array($p1, $p2));
$dm->persist($p1);
$dm->persist($p2);
$dm->persist($c1);
$dm->persist($c2);
$dm->flush();
查看 MongoDB,我现在有以下数据:
db.Category.find()
{ "_id" : ObjectId("53e3d8d3e2afec2303d63afa"), "name" : "category1", "products" : [ DBRef("Product", ObjectId("53e3d8d3e2afec2303d63af8")), DBRef("Product", ObjectId("53e3d8d3e2afec2303d63af9")) ] }
{ "_id" : ObjectId("53e3d8d3e2afec2303d63afb"), "name" : "category2", "products" : [ DBRef("Product", ObjectId("53e3d8d3e2afec2303d63af8")), DBRef("Product", ObjectId("53e3d8d3e2afec2303d63af9")) ] }
db.Product.find()
{ "_id" : ObjectId("53e3d8d3e2afec2303d63af8"), "name" : "p1", "price" : 1.99 }
{ "_id" : ObjectId("53e3d8d3e2afec2303d63af9"), "name" : "p2", "price" : 3.99 }
我现在想查询这个数据:通过id获取一个产品并获取它的所有类别,它属于:
$product = $dm->find('Documents\Product', '53e3d8d3e2afec2303d63af8');
var_export($product->getName());
$category = $product->getCategory();
var_export(sizeof($category));
foreach($category as $c){
var_export($c->getName());
}
// Outputs: 'p1' 2 'category1' 'category2'
但是如果我想反过来查询数据:获取一个类别并获取其所有产品,该类别有:
$category = $dm->find('Documents\Category', '53e3d8d3e2afec2303d63afa');
var_export($category->getName());
$products = $category->getProducts();
var_export(sizeof($products));
foreach($products as $p){
var_export($p->getName());
}
// Outputs: 'category1' 2
没有显示任何产品,我收到一个 fatal error :
Fatal error: Uncaught exception 'MongoCursorException' with message 'localhost:27017: Can't canonicalize query: BadValue $in needs an array' in /private/var/www/mongo/vendor/doctrine/mongodb/lib/Doctrine/MongoDB/Cursor.php on line 288
如果我查看 MongoDB 日志,查询如下:
assertion 17287 Can't canonicalize query: BadValue $in needs an array ns:shop.Product query:{ $query: { _id: { $in: { 53e3d8d3e2afec2303d63af8: ObjectId('53e3d8d3e2afec2303d63af8'), 53e3d8d3e2afec2303d63af9: ObjectId('53e3d8d3e2afec2303d63af9') } } }, $orderby: [] }
我的意思是,问题似乎很清楚:$in
需要一个数组,但没有给定 JSON 数组。但我不知道如何修复它。我究竟做错了什么?如果您不能回答这个特定问题,您能否为我提供一个使用 Doctrine 的 MongoDB 的工作示例,其中您有这样的多对多关系并且可以通过双方查询数据?
更新:我也许应该提到我使用的是哪个版本的 Doctrine 。我使用了这个设置:
{
"require":{
"doctrine/common":"2.3.*",
"doctrine/dbal":"2.3.*",
"doctrine/orm":"*",
"doctrine/mongodb-odm": "1.0.0-BETA9"
}
}
然后我想到更新到可用的最新版本并使用了这个设置:
{
"require":{
"doctrine/common":"2.4.*",
"doctrine/dbal":"2.3.*",
"doctrine/orm":"*",
"doctrine/mongodb-odm": "dev-master"
}
}
瞧:一切正常……我的天啊。但是仍然欢迎对此进行任何解释,我想知道这里发生了什么。非常感谢。
最佳答案
您遇到的错误已在 PR #743 中修复,包含在 1.0.0-BETA10 中。这是与 MongoDB 2.6 兼容所必需的几个修复程序之一(请参阅 issue #741 ),因为服务器在验证查询条件方面变得更加严格。
2.4 之前的服务器版本接受 $in
的对象,并简单地忽略键。如果你看一下 BSON specification ,你会注意到除了类型代码之外,数组和对象的结构非常相似。每个都是一系列键/值对,数组有效负载看起来非常像以连续数字字符串作为键的对象。这应该可以解释为什么旧服务器版本很容易接受任何一种类型。
关于MongoDB Doctrine : $in needs an array - Many to Many Relation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25630884/
我想知道,如果我的函数没有相似的名称,我是否需要使用命名空间? 另外我无法掌握从特定文件夹导入所有命名空间的方法... 最佳答案 I'm wondering, that if my functions
我运行 2to3 -f all -f idioms -f buffer -f set_literal -f ws_comma foo.py 输出: RefactoringTool: No change
我对 RoR 还是很陌生,我正在尝试使用 button_to delete 按钮删除一个对象。但是,使用我编写的代码,当我尝试将它获取到 destroy 方法的/needs/:id 时,它会将我带到/
当我运行代码时,我在 DEBUG Console 中发现了这个错误如下图所示错误: Restarted application in 2,804ms. [38;5;248m════════ Excep
我有一个实现 __dir__ 方法的类。但是,我并不完全确定 dir API 的一些细节。 A:__dir__ 是否真的需要返回一个列表?我的实现是使用 set 来避免两次列出属性,我需要在返回之前将
我正在尝试执行对非官方 Instagram API python 库的调用,在我修复了几个需要依赖项的错误之后,我被困在了这个错误上。 File "C:\Users\Pablo\Desktop\tx
我正在使用 SingleChildScrollView 和 Column 来显示滑动条和 gridview。 如果我在我的专栏中使用一些其他小部件,如文本、图像,应用程序显示正常。但是我的swiper
我正在尝试卸载 zsh 插件 (macos),我修改了 .zshrc 文件并从 中删除了 macos >plugin 列表,并删除路径 ~/.oh-my-zsh/plugins 中的 macos 文件
我正在尝试卸载 zsh 插件 (macos),我修改了 .zshrc 文件并从 中删除了 macos >plugin 列表,并删除路径 ~/.oh-my-zsh/plugins 中的 macos 文件
Exception caught by rendering library ═════════════════════════════════ RenderBox was not laid out:
我对 Python 很陌生。我正在试用 threading模块。我遇到了 Event对象。 事件对象有wait set clear职能。我了解等待、设置和清除正在做什么。但是我不太明白为什么会有一个单
我需要在 SQL Server 的 sql 查询中转义 [ select * from sometable where name like '[something]'; 我实际上正在寻找某个东西之前的
我的要求是这样的: 我在数据库和时区中保存以毫秒为单位的时间。例如,以毫秒为单位的时间是 1223123123232长时区是 Asia/Calcutta 。我必须将其转换为 Africa/Asmara
我的表中有两个整数列,其中第一列填充了一些随机数,第二列为空。现在是否可以将第一列按升序排序,同时按降序排序并显示为第二列?我有下表的示例。 初始表: col1 col2 5 7 3 9
我正在使用 Instruments 检查我的应用程序的内存泄漏并向我展示: NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ChangeAcc
我有课 class Person { // some other fields for this object std::vector relatives; } 然后是一个返回 Person
在下面的代码中,为什么需要 .page-wrap:after? 理论上,如果没有这个,粘性页脚不应该工作吗?为什么不呢? * { margin: 0; } html, body { heigh
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我看过维基百科的图数据库,还是不明白。 什么是“无索引邻接”? 可不可以理解为“不是把主键存到其他表的行,而是直接存这些行的物理位置” 最佳答案 当您的数据可以表示为图形( map 上的路线、一些树等
我是 AngularJS 的新手,但我真的很喜欢 AngularJS 的工作方式,所以我想将它部署为我的 Google 云端点后端的客户端。然后我立即遇到两个问题: 1、放在哪里myCallback
我是一名优秀的程序员,十分优秀!