C#MongoDB-根据ID从嵌套文档的数组中提取项目

时间:2019-07-31 14:51:57

标签: c# arrays mongodb bson

我们一直在努力进行数小时的查询,这对我们来说似乎很容易,而且我们是通过Robo 3T进行的...现在的问题是将其转换为C#,但我们找不到方法,我们没有甚至不明白为什么它不起作用。

我们有以下查询:

RewriteEngine on
RewriteCond % {REQUEST_FILENAME} !-f
RewriteCond % {REQUEST_FILENAME} !-d
RewriteRule ^ 404.html
ErrorDocument 404 /404.html

现在我们的查询成功了,我们尝试将其转换为c#,到目前为止,我们已经达到了这一点,我们还真的不知道问题的根源。

db.getCollection('UserCollection').update({"User.Contacts._id": ObjectId("xxx")}, 
{
    $pull: {
        "User.Contacts": {
           "_id": {$in:[ObjectId("xxx")]}
    }
  }
})

在这里您看到public Task PullSocialInfoAsync(ObjectId contactId) { var fieldName = nameof(UserContainer.User) + "." + nameof(UserContainer.User.Contacts) + "._id"; var filter = NewFilterBuilder().Eq(fieldName, contactId); var update = new BsonDocument("$pull", new BsonDocument(nameof(UserContainer.User) + "." + nameof(UserContainer.User.Contacts), new BsonDocument("_id", new BsonDocument("$in", new BsonArray() { contactId })))); return GetCurrentCollection().FindOneAndUpdateAsync(filter, update); } ,但我们也尝试过FindOneAndUpdateAsync,即使我们将字符串查询与Robo上的查询匹配,我们也多次更改了BsonArray的初始化但没有成功。 3T

基于上述C#查询,我们得到以下输出: UpdateAsync。最有趣的部分是,如果我复制粘贴..效果很好

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的要求,那么您就需要pullFilter

var filter = Builders<UserCollection>.Filter.Where(u => u.User.Contacts.Any(c => c._Id == contactID));
var update = Builders<UserCollection>.Update.PullFilter(u => u.User.Contacts, c => c._Id == contactID);
collection.UpdateOne(filter, update);

这是测试任何人是否有兴趣的完整程序。

using MongoDB.Entities; // PM> Install-Package MongoDB.Entities
using MongoDB.Bson;    
using System.Linq;

namespace StackOverflow
{
    public class Program
    {
        public class UserCollection : Entity
        {
            public User User { get; set; }
        }

        public class User
        {
            public Contact[] Contacts { get; set; }
        }

        public class Contact
        {
            public ObjectId _Id { get; set; }
        }

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

            var contactID = ObjectId.GenerateNewId();

            (new UserCollection
            {
                User = new User
                {
                    Contacts = new[]
                    {
                        new Contact { _Id = ObjectId.GenerateNewId()},
                        new Contact { _Id = contactID}
                    }
                }
            }).Save();

            DB.Update<UserCollection>()
              .Match(u => u.User.Contacts.Any(c => c._Id == contactID))
              .Modify(b => b.PullFilter(u => u.User.Contacts, c => c._Id == contactID))
              .Execute();
        }
    }
}