Arrays MongoDB具有唯一值的多个数组

Arrays MongoDB具有唯一值的多个数组,arrays,mongodb,unique,dynamic-queries,Arrays,Mongodb,Unique,Dynamic Queries,我在创建模式和以“正确”的方式设置数据库时遇到了一个小小的难题。我有一个包含4个不同数组的对象的集合。集合项中的对象看起来类似于: itemInCollection{ ... theObj: {arr1: ["user1685", "user5342"], arr2: ["user1432"], arr3: [], arr4: ["user1632", "user2312", "user6452"]}, ... } 我创建的模式已经要求所有数组项都是唯一的,但我也不希望

我在创建模式和以“正确”的方式设置数据库时遇到了一个小小的难题。我有一个包含4个不同数组的对象的集合。集合项中的对象看起来类似于:

itemInCollection{
    ...
    theObj: {arr1: ["user1685", "user5342"], arr2: ["user1432"], arr3: [], arr4: ["user1632", "user2312", "user6452"]},
    ...
}
我创建的模式已经要求所有数组项都是唯一的,但我也不希望所有数组都包含与另一个相同的条目。有时我还需要将已经在一个数组中的项移动到另一个数组中(当然还要从旧数组中删除条目,因为所有数组都不应该包含相同的条目)。这显然不是跟踪此类事件的最佳方式,或者是这样吗

到目前为止,我有4个查询,分别检查每个数组中的某个条目,另一个查询在没有找到条目的情况下将条目添加到相应的数组中。。。以及另一个查询,该查询将删除可能在另一个数组中找到的条目,然后再将其添加到另一个数组中

有没有更好的方法来建立数据库来跟踪这样的事情?或者,是否有一种动态方式来查询多个数组,而不是使用6-7个不同的查询

感谢所有提前为您提供的时间和帮助:)

您可以将“用户”数据结构化为子文档,而不是像这样的字符串:

itemInCollection{
    ...
    theObj: [
        { userid: "user1685", type: "arr1" },
        { userid: "user5342", type: "arr1" },
        { userid: "user1432", type: "arr2" },
        { userid: "user1632", type: "arr4" },
        { userid: "user2312", type: "arr4" },
        { userid: "user6452", type: "arr4" }
    ],
    ...
}
有了这种结构,应该更容易确保唯一性(不幸的是,在这个阶段,无法确保数组中特定字段的唯一性-请参见)。

您可以将“用户”数据结构为子文档,而不是如下所示的字符串:

itemInCollection{
    ...
    theObj: [
        { userid: "user1685", type: "arr1" },
        { userid: "user5342", type: "arr1" },
        { userid: "user1432", type: "arr2" },
        { userid: "user1632", type: "arr4" },
        { userid: "user2312", type: "arr4" },
        { userid: "user6452", type: "arr4" }
    ],
    ...
}

有了这个结构,应该更容易确保唯一性(在这个阶段,不幸的是,没有办法确保数组中特定字段的唯一性-请参见)。

理论上,如果我使用这个,并且我知道我想要的集合项的ID,我是否应该使用类似
db.collection.find({u ID]:theID,“theObj”:{$elemMatch:{“userID”:“someUser”}})
检查用户是否在数组中并替换项目或插入新项目?或者是否有一个
upsert
操作可以同时在一个数组中执行这两个操作?这确实很有趣。而且,是的,有一个upsert操作,但是,由于数组的原因,它不会有太大帮助…请参阅此链接:我将进一步研究这两个操作…但是您还说,让模式指定bj具有唯一项在这种情况下不起作用,因为它们是文档?是的,恐怕是这样。您可以使一些位唯一,但只能跨文档,而不能在特定文档的数组中。这是无法做到的。但您可以在更新y时控制这种唯一性我们通过使用
$addToSet
而不是
$push
来创建数组。理论上,如果我使用它并且知道我想要的集合项的ID,我应该使用类似于
db.collection.find({“\u ID”:theID,“theObj”:{$elemMatch:{“userID”:“someUser”}})的东西吗
检查用户是否在数组中并替换项目或插入新项目?或者是否有一个
upsert
操作可以同时在一个数组中执行这两个操作?这确实很有趣。而且,是的,有一个upsert操作,但是,由于数组的原因,它不会有太大帮助…请参阅此链接:我将进一步研究这两个操作…但是您还说,让模式指定bj具有唯一项在这种情况下不起作用,因为它们是文档?是的,恐怕是这样。您可以使一些位唯一,但只能跨文档,而不能在特定文档的数组中。这是无法做到的。但您可以在更新y时控制这种唯一性我们的阵列使用
$addToSet
而不是
$push